Ansible - 如何将文件内容连接到一个变量中
Ansible - how to concatenate files contents into a variable
如何将多个文件的内容连接成一个变量?
问题所在:我正在尝试为远程计算机上的用户设置 public 键。 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
,所以更新后所有未提供的public键都被删除了。
如果提供了 exclusive=yes
,则只有最后列出的 public 键保留在 .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 连接您的密钥。
然后这会将您当前的方法更改为更像:
- 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 密钥都是文件并位于同一文件夹中(assemble 通常用于将 conf.d 样式目录转换为单个 .conf 文件,以供不使用的程序使用conf.d 样式配置)但这可能是最明智的持有方式。
这样做的好处是您可以简单地从指定的文件夹中 add/remove ssh 密钥,它将在下一次播放时被拾取,而不需要 add/remove 密钥在任务本身也是如此。
如果您使用 assemble module,您也可以使用它一步生成远程 authorized_keys
文件,而不是 pre-assembling 在本地,它也保持绿色:
- name: deploy authorized keys
assemble:
remote_src: no
src: "{{ ssh_key_dir }}"
dest: "/home/{{ user }}/.ssh/authorized_keys"
如何将多个文件的内容连接成一个变量?
问题所在:我正在尝试为远程计算机上的用户设置 public 键。 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
,所以更新后所有未提供的public键都被删除了。
如果提供了 exclusive=yes
,则只有最后列出的 public 键保留在 .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 连接您的密钥。
然后这会将您当前的方法更改为更像:
- 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 密钥都是文件并位于同一文件夹中(assemble 通常用于将 conf.d 样式目录转换为单个 .conf 文件,以供不使用的程序使用conf.d 样式配置)但这可能是最明智的持有方式。
这样做的好处是您可以简单地从指定的文件夹中 add/remove ssh 密钥,它将在下一次播放时被拾取,而不需要 add/remove 密钥在任务本身也是如此。
如果您使用 assemble module,您也可以使用它一步生成远程 authorized_keys
文件,而不是 pre-assembling 在本地,它也保持绿色:
- name: deploy authorized keys
assemble:
remote_src: no
src: "{{ ssh_key_dir }}"
dest: "/home/{{ user }}/.ssh/authorized_keys"