Ansible:读取远程文件

63

我使用Ansible在远程主机上生成文件,生成后,我想在另一个任务中读取这些文件。

我没有找到任何模块可以用于在远程主机上读取文件(似乎Lookup仅限于本地主机)。

你知道有这样的模块吗?

谢谢

编辑:

这是我的用例:

我生成SSH密钥并将其添加到GitHub。 这些密钥由var文件中的对象设置,所以我像这样循环生成它:

    tasks:
  - name: Create ssh key
    user:
      name: "{{sshConfigFile.user}}"
      generate_ssh_key: yes
      ssh_key_file: ".ssh/{{item.value.file}}"
      state: present
    with_dict: "{{sshConfiguration}}"

它非常好用,但如何读取这些密钥并通过API发送到github?


另请参见https://dev59.com/N2Ag5IYBdhLWcg3wE3nQ。 - Gert van den Berg
5个回答

147

可以使用 --diff 标记运行(在目标文件更改时输出差异)..

ansible-playbook --diff server.yaml

或者 slurp 它起来...

- name: Slurp hosts file
  slurp:
    src: /etc/hosts
  register: slurpfile

- debug: msg="{{ slurpfile['content'] | b64decode }}"

3
我认为这将来会成为最佳答案。 - danday74
4
这是惯用的解决方案。 - Sion
2
五年后,我没有错吧……我曾经以为自己错了一次,但其实是弄错了。 - danday74

13

请注意,当提出这个问题时,以下解决方案是可接受的。后续版本的Ansible可能会提供更好的解决方案来解决此问题。

正如你所说,所有查找都在本地主机上。但是通过使用shellregister,所有查找都可以在远程执行。你能具体说明一下你要做什么吗?举个例子就可以了。

  - shell: cat "{{remote_file}}"
    register: data

  - shell: ......
    with_xxxx:

我尝试过那样做,但是我不能这样做,因为我需要在另一个对象上循环。 - Kiva
10
尽可能避免使用 shell 和 command 模块(它们不是天然的幂等性),应该使用 slurp 模块。虽然由于这是只读操作,使用 shell 命令也可以接受,但最好养成在存在自然的 Ansible 解决方案的情况下避免使用 shell 命令的习惯。请参阅下面的答案以获取最佳方法。 - danday74

8

您可以尝试使用“fetch”模块,该模块将密钥文件检索到localhost上的目标路径:

fetch: 
  src: ".ssh/{{item.value.file}}" 
  dest:"/tmp/ssh_keys/{{item.value.file}}"
  flat: yes
with_dict: "{{sshConfiguration}}" 

1
好的回答,但是slurp更好,它避免在本地主机上创建临时文件。fetch的文档说,在底层它使用了slurp。 - danday74
2
@danday74,您说得对,使用slurp可以避免使用临时文件。但是,如果您重新阅读fetch的注释,它指出:“在使用become运行fetch时,也将使用slurp模块[...]”。在这个例子中,他没有使用become。 - Oberst

3
您可以使用注册命令将文件内容存储在变量中。这是我建议的方法,
- name: get contents of file
  command: cat /path/to/file
  register: filename
  become: true # use case specific option

- name: viewing the contents
  debug:
    msg: "{{filename.stdout}}"

这将显示文件的内容。

请返回翻译后的文本:https://dev59.com/nlsW5IYBdhLWcg3wqYt7#34725536 - Gert van den Berg

-7

通过使用命令模块,您可以在远程节点的另一个任务中读取或使用该文件。

就像这样

-command: cp /tmp/xxx/example.sh /usr/local/yyy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接