Ansible — Проблема при записи выходных данных в файл CSV

#ansible

#ansible

Вопрос:

Версия Ansible — 2.9

Столкнувшись с проблемой при записи выходных данных в файл CSV, он не записывает выходные данные последовательно в файл.

Имея файл инвентаризации с тремя IP-адресами сервера, скрипт выполнит команду для проверки дискового пространства каждого сервера и записи выходных данных в файл CSV.

Иногда это запись всех трех сведений о сервере в файл, иногда это запись только одного или двух сведений о сервере в файл.

   - hosts: localhost
    connection: local
    gather_facts: False
    vars:
      filext: ".csv"
    tasks:
      - name: get the username running the deploy
        local_action: command whoami
        register: username_on_the_host

      - name: get current dir
        local_action: command pwd
        register: current_dir

      - name: create dir
        file: path={{ current_dir.stdout }}/HCT state=directory

      - name: Set file path here
        set_fact:
            file_path: "{{ current_dir.stdout }}/HCT/HCT_check{{ filext }}"

      - name: Creates file
        file: path={{ file_path }}  state=touch

# Writing to a csv file

    - hosts:
      - masters
    become: false
    vars:
      disk_space: "Able to get disk space for the CM {{ hostname }} "
      disk_space_error: "The server {{ hostname  }} is down for some reason. Please check manually."
      disk_space_run_status: "{{disk_space}}"
      cur_date: "{{ansible_date_time.iso8601}}"

    tasks:
      - name: runnig command to get file system which are occupied 
        command: bash -c "df -h | awk '$5>20'"
        register: disk_space_output
        changed_when: false
        ignore_errors: True
        no_log: True

      - name: Log the task get list of file systems with space occupied 
        lineinfile:
           dest: "{{ hostvars['localhost']['file_path'] }}"
           line: "File system occupying disk space, {{ hostname }}, {{ ip_address }}, {{ cur_date }}"
           insertafter: EOF
           state: present
        delegate_to: localhost
  

Пожалуйста, помогите решить эту проблему.

Ответ №1:

Проблема в том, что задача «Войти в список файловых систем с занятым пространством» выполняется параллельно для 3 серверов, поэтому у вас возникают проблемы с одновременной записью.

Одним из решений является использование serial ключевого слова на уровне воспроизведения со значением 1 , таким образом, все задачи будут выполняться для каждого сервера по очереди.

 - hosts:
  - masters
become: false
serial: 1
vars:
[...]
  

Другое решение состоит в том, чтобы выполнить задачу только для 1 сервера, но перебирать результаты всех серверов с помощью hostvars :

   - name: Log the task get list of file systems with space occupied 
    lineinfile:
       dest: "{{ hostvars['localhost']['file_path'] }}"
       line: "File system occupying disk space, {{ hostvars[item].hostname }}, {{ hostvars[item].ip_address }}, {{ hostvars[item].cur_date }}"
       insertafter: EOF
       state: present
    run_once: True
    loop: "{{ ansible_play_hosts }}"  # Looping over all hosts of the play
    delegate_to: localhost