Ansible запись вывода из нескольких задач в один файл

В Ansible я написал плейбук Yaml, который берет список имен хостов и выполняет команду для каждого хоста. Я зарегистрировал переменную для этой задачи, и в конце выполнения задачи я добавляю вывод каждой команды в один файл. Но каждый раз, когда я пытаюсь добавить в свой выходной файл, сохраняется только последняя запись.

---
- 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"

Я даже пытался добавить, используя lineinfile, используя параметр insertafter, но безуспешно. Что-нибудь, что мне не хватает?


person user3059993    schedule 13.07.2016    source источник


Ответы (2)


Вы можете попробовать что-то вроде этого:

- 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 задачи, работающие параллельно, исказят выходной файл.

person Amit    schedule 14.07.2016

Ansible doc рекомендует использовать копию:

- 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 
person Dmitriy    schedule 19.05.2017
comment
Это бесполезно, когда вывод многострочный. Строка всегда перезаписывается новой строкой. - person QkiZ; 24.11.2017