是否有一种简单的方法可以将多个远程主机的输出记录到运行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文件中的所有主机中捕获行。
答案 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)。