#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