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

标签 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

这有效,但前两个命令总是产生“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 module连接您的 key 。

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

- 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 key 都是文件并且位于同一文件夹中(对于不使用 conf.d 样式配置的程序,汇编通常用于将 conf.d 样式目录转换为单个 .conf 文件)但是无论如何,这可能是最明智的持有方式。

这样做的好处是,您可以简单地从指定的文件夹中添加/删除 ssh key ,并且将在下一次播放时拾取该 key ,而无需在任务本身中显式定义添加/删除 key 。

关于Ansible - 如何将文件内容连接到变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33032747/

相关文章:

Ansible 剧本变量在模板中不起作用

ansible - 服务和 systemd 模块要求输入 sudo 密码

ansible - 理解 Ansible 的条件表达式

Erlang、SSH 和authorized_keys

git - 无法打开用户的 ssh/authorized_keys

nginx - 错误!任务中未检测到任何操作。安西 bool

python - 在剧本中使用authorized_key模块为新用户设置SSH key

docker - 透明的 ssh 连接转发到 docker 容器

ssh - 将公钥添加到 ~/.ssh/authorized_keys 不会自动登录

regex - Ansible 正则表达式替换 Ubuntu netplan 文件中的 DNS 地址