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

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

这个可以工作,但是前两个命令总是生成"changed"。而且我觉得一定有一个更优雅的解决方案。

所以,有一种方法如何将几个文件的内容连接到一个变量?或者是否有更好的方法来完成这个任务?

你的第一个选项没有什么过分的错误,然后,正如你的评论提到的,简单地使用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模块来连接键。

这将改变你当前的方法,更像是:

- 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密钥,并且它将在下次播放时被捡起,而无需在任务本身中明确定义添加/删除密钥。

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

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

相关内容

  • 没有找到相关文章

最新更新