Ansible—将每个远程主机的标准输出行记录到本地服务器上的单个文件

Ansible—将每个远程主机的标准输出行记录到本地服务器上的单个文件,ansible,Ansible,在运行ansible playbook的服务器上,是否有一种简单的方法将多个远程主机的输出记录到单个文件中 我有一个名为validate的变量,它存储在每台服务器上执行的命令的输出。我想使用validate.stdout\u行并将来自每个主机的行本地放到一个文件中 以下是我写的但不起作用的片段之一: - name: Write results to logfile blockinfile: create: yes path: "/var/log/ansible/log"

在运行
ansible playbook
的服务器上,是否有一种简单的方法将多个远程主机的输出记录到单个文件中

我有一个名为
validate
的变量,它存储在每台服务器上执行的命令的输出。我想使用
validate.stdout\u行
并将来自每个主机的行本地放到一个文件中

以下是我写的但不起作用的片段之一:

- name: Write results to logfile
  blockinfile:
    create: yes
    path: "/var/log/ansible/log"
    insertafter: BOF
    block: "{{ validate.stdout }}"
  delegate_to: localhost

当我执行上面提到的playbook时,它只能捕获来自一个远程主机的输出。我想捕获单个/var/log/ansible/log文件中所有主机的行

您应该做的一件事是向
块填充添加
标记
,以将来自每个主机的结果包装在一个唯一的块中

第二个问题是任务将并行运行(即使使用
委托给:localhost
,因为这里的循环是由Ansible引擎实现的),其中一个任务有效地覆盖了另一个的
/var/log/Ansible/log
文件

作为一种快速解决方法,您可以连续播放整个剧本:

- hosts: ...
  serial: 1

  tasks:
    - name: Write results to logfile
      blockinfile:
        create: yes
        path: "/var/log/ansible/log"
        insertafter: BOF
        block: "{{ validate.stdout }}"
        marker: "# {{ inventory_hostname }} {mark}"
      delegate_to: localhost

上面产生了预期的结果,但是如果串行执行是一个问题,您可能会考虑为这个单一任务编写自己的循环(供参考)。



说到其他方法,有两个任务:您可以将结果连接到一个列表中(并行执行没有问题,但请注意),然后使用
copy
module(请参阅)写入文件。

谢谢techraf!利用你的推荐信,我想出了一个解决办法,我把它附在了你的回复之后。