8

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

这是问题所在:我正在尝试为远程计算机上的用户设置公钥。几乎可以工作的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

但实际上我需要使用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

这可行,但前两个命令总是产生“改变”。我也觉得必须有一个更优雅的解决方案。

那么,有没有办法将多个文件的内容连接成一个变量?还是一般来说有更好的方法来完成这项任务?

4

2 回答 2

9

您的第一个选项没有什么过分的错误,然后,正如您的评论所提到的,简单地使用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

但是,更简洁的选择可能是使用assemble 模块来连接您的密钥。

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

- 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 样式配置的程序,assemble 通常用于将 conf.d 样式目录转换为单个 .conf 文件)但这可能是无论如何,握住它们的最明智的方式。

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

于 2015-10-09T10:20:35.627 回答
2

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

- name: deploy authorized keys
  assemble:
    remote_src: no
    src: "{{ ssh_key_dir }}"
    dest: "/home/{{ user }}/.ssh/authorized_keys"
于 2020-08-20T16:03:49.733 回答