Ansible - 将每个远程主机的stdout行记录到本地服务器上的单个文件

时间:2017-09-13 20:53:20

标签: ansible

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

我有一个名为validate的变量,它存储在每个服务器上执行的命令的输出。我想取validate.stdout_lines并将每个主机的行放在本地的一个文件中。

以下是我编写的一段代码,但没有成功:

- 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文件中的所有主机中捕获行。

1 个答案:

答案 0 :(得分:2)

您应该做的一件事是向marker添加blockinfile,以便将每个主机的结果包装在一个唯一的块中。

第二个问题是任务将并行运行(即使使用delegate_to: 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

上面会产生预期的结果,但是如果串行执行有问题,你可以考虑为这个单独的任务编写自己的循环(想法请参考support for "serial" on an individual task #12170)。

说到其他方法,在两个任务中:你可以将结果连接成一个列表(然后没有并行执行问题,但要注意delegated facts)然后使用{{1}写入文件}模块(见Write variable to a file in Ansible)。