Ansible将多个任务的输出写入单个文件

时间:2016-07-13 23:37:11

标签: ansible-playbook ansible-2.x

在Ansible中,我编写了一个Yaml playbook,其中包含主机名列表和每个主机的执行命令。我为这些任务注册了一个变量,在执行任务结束时,我将每个命令的输出附加到一个文件中。 但每次我尝试附加到我的输出文件时,只有最后一条记录会被持久化。

---
- hosts: list_of_hosts
  become_user: some user
  vars:
    output: []
  tasks:
    - name: some name
      command: some command
      register: output
      failed_when: "'FAILED' in output"
    - debug: msg="{{output | to_nice_json}}"
    - local_action: copy content='{{output | to_nice_json}}' dest="/path/to/my/local/file"

我甚至试图使用insertafter参数使用lineinfile追加但是没有成功。 我缺少什么?

3 个答案:

答案 0 :(得分:3)

您可以尝试这样的事情:

- name: dummy
  hosts: myhosts
  serial: 1
  tasks:
    - name: create file
      file:
        dest: /tmp/foo
        state: touch
      delegate_to: localhost

    - name: run cmd
      shell: echo "{{ inventory_hostname }}"
      register: op

    - name: append
      lineinfile:
        dest: /tmp/foo
        line: "{{ op }}"
        insertafter: EOF
      delegate_to: localhost

我使用serial: 1因为我不确定并行运行的lineinfile任务是否会使输出文件混乱。

答案 1 :(得分:1)

Ansible doc建议使用copy:

- name: get jstack                                                                        
  shell: "/usr/lib/jvm/java/bin/jstack -l {{PID_JAVA_APP}}"                                                             
  args:                                                                                                      
    executable: /bin/bash
  register: jstackOut                                           

- name: write jstack                                                                                
  copy:                                                                                              
     content: "{{jstackOut.stdout}}" 
     dest: "tmp/jstack.txt"

如果您想写本地文件,请添加:

     delegate_to: localhost 

答案 2 :(得分:0)

我认为这可能会帮助您... 该手册检查了LINUX系统的基本硬件信息,并将输出保存在单个文件中

- name: LINUX CONFIGURATION CHECK
  gather_facts: false
  hosts: linux
  tasks:
    - name: Checking IP Address
      shell: hostname -I
      register: ip
    - name: Checking Mac Address
      shell: lshw -class network | grep -E 'serial:' | cut -d " " -f9
      register: mac
    - name: Checking OS Version
      shell: cat /etc/*release | grep PR | cut -d "\"" -f2
      register: os

    - local_action: copy content={{ip.stdout}} dest=/etc/ansible/output.txt

    - name: Append
      lineinfile:
        dest: /etc/ansible/finalout.txt
        line: "{{mac.stdout}}{{os.stdout}}"
        insertafter: EOF
      delegate_to: localhost

本地操作将答案复制并保存到文件中。 将插入插入内容输出到 EOF-文件末尾