Ansible - 如何将文件内容连接到变量中

Ika*_*ský 7 authorized-keys ansible

如何将多个文件的内容连接成一个变量?

这是问题所在:我正在尝试为远程计算机上的用户设置公钥.来自authorized_key文档的示例几乎可以正常工作:

- name: Set up authorized_keys for the deploy user
  authorized_key: user=deploy
                  key="{{ item }}"
  with_file:
    - public_keys/doe-jane
    - public_keys/doe-john
Run Code Online (Sandbox Code Playgroud)

但事实上我需要使用exclusive=yes,因此在更新后,所有未提供的公钥都将被删除.

如果exclusive=yes提供了,那么只有列出的最后一个公钥保留在.ssh/authorized_keys文件中(也报告为错误).

我目前的做法:

- name: create empty temporary keys file
  local_action: "shell > /tmp/auth_keys"

- name: concat keys to temporary file
  local_action: "shell echo {{ item }} >> /tmp/auth_keys"
  with_file:
   - public_keys/doe-jane
   - public_keys/doe-john

- name: set up authorized_keys
  authorized_key: user=deploy
                  key="{{ lookup('file', '/tmp/auth_keys') }}"
                  exclusive=yes
Run Code Online (Sandbox Code Playgroud)

这有效但前两个命令总是产生"已更改".此外,我觉得必须有一个更优雅的解决方案.

那么,有没有办法将几个文件的内容连接成一个变量?或者这项任务有更好的方法吗?

yda*_*coR 7

你的第一个选项没有任何过分的错误,然后,正如你的评论所提到的那样,只是changed_when: False用来承认这不是你关心的变化结果是一个有效的选择.

要回答实际的问题标题,你可以在你链接的GitHub"问题"中提到,只需在任务中直接连接查找,如下所示:

- name: set up authorized_keys
  authorized_key: user=deploy
                  key="{{ lookup('file', 'public_keys/doe-jane') + lookup('file', 'public_keys/doe-john')}}"
                  exclusive=yes
Run Code Online (Sandbox Code Playgroud)

但是,更清晰的选项可能是使用汇编模块来连接您的密钥.

这会将您当前的方法更改为更像:

- name: create concatenated keys file
  local_action: "assemble src=roles/ssh_keys/files/ssh_keys/ dest=/tmp/ssh_keys_file"

- name: set up authorized_keys
  authorized_key: user=deploy
                  key="{{ lookup('file', '/tmp/ssh_keys_file' }}"
                  exclusive=yes
Run Code Online (Sandbox Code Playgroud)

如果目标文件完全改变了,那么只会将其标记为已更改,因此一遍又一遍地运行它会留下一块可爱的绿色墙.

这依赖于你的ssh键所有文件和同一文件夹(汇编通常用于将conf.d样式目录转换为单个.conf文件,用于不使用conf.d样式配置的程序)但这可能是无论如何,持有他们最明智的方式.

这样做的好处是你可以简单地从指定的文件夹添加/删除ssh密钥,它将在下一次播放时被选中,而不需要添加/删除在任务本身中明确定义的密钥.

  • 正如第一个代码块所提到的,您可以直接连接变量中的所有查找,这将起作用.它对我来说看起来很可怕,我不相信它是管理它们的好方法,但它会完全按照你的意愿行事.我个人更喜欢让不同的目录充满公钥的想法,这些公钥可以应用于不同的环境类型,即使有一些重复的密钥.这样,如果你在dev和test文件夹中看到"doe-jane",你就会立即知道Jane Doe可以访问dev和test. (2认同)