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

时间:2015-10-09 07:47:33

标签: ansible authorized-keys

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

问题在于:我正在尝试为远程计算机上的用户设置公钥。来自authorized_key documentation的示例几乎可以运作:

- 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

但实际上我需要使用exclusive=yes,因此在更新之后会删除所有未提供的公钥。

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

我目前的做法:

- 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

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

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

2 个答案:

答案 0 :(得分:7)

您的第一个选项没有任何过分错误,然后,正如您的评论所提到的那样,只需使用changed_when: False来确认这不是您关心的更改结果是一个有效的选项。

要回答实际的问题标题,正如您链接的GitHub "issue"中所述,只需直接在任务中连接查找,如下所示:

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

但是,更清晰的选项可能是使用assemble module来连接您的密钥。

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

- 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

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

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

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

答案 1 :(得分:0)

如果您使用assemble module,也可以使用它一步生成远程authorized_keys文件,而不必在本地进行预组装,它也保持绿色:

- name: deploy authorized keys
  assemble:
    remote_src: no
    src: "{{ ssh_key_dir }}"
    dest: "/home/{{ user }}/.ssh/authorized_keys"