Ansible: добавление значений к переменной в цикле
Я работаю над пьесой, которая делает следующее:
- Идет по указанному пути на каждом сервере Windows
- Отбрасывает текст из файла и добавляет его в переменную
- Выполняет проверку переменной, чтобы увидеть, существует ли строка текста
- Записывает результаты в файл на основе результата.
Вот код, который у меня есть для этого:
---
- name: Slurps text from file on Windows server
hosts: win
gather_facts: false
tasks:
- name: Get text
slurp:
src: D:\testsearch.ini
register: norequest
- name: Check for norequest=false in variable
lineinfile:
dest: ./norequest.csv
line: "{{ inventory_hostname }} There is a false value"
state: present
create: true
insertafter: EOF
when: '"''NoRequest = False'' in norequest.content|b64decode"|lower'
delegate_to: localhost
- name: Check for norequest=true in variable
lineinfile:
dest: ./norequest.csv
line: "{{ inventory_hostname }} There is a true value."
state: present
create: true
insertafter: EOF
when: '"''NoRequest = True'' in norequest.content|b64decode"|lower'
delegate_to: localhost
Исходя из моих результатов, похоже, что книга воспроизведения отбирает текст из файлов на обоих тестовых серверах и добавляет все это в переменную, затем выполняет условную проверку на одном из серверов (поскольку сама задача делегируется localhost) и выводит результаты в файл так, как будто все они получены от SERVER1 (последняя часть, похоже, связана с делегированием).
PLAY [Slurps text from file on Windows server] *******************************
TASK [Delete previous norequest file] *******************************
changed: [SERVER1 -> localhost]
TASK [Get text] ***************************************
ok: [SERVER2]
ok: [SERVER1]
TASK [Check for norequest=false in variable] ********************************
changed: [SERVER1 -> localhost]
TASK [Check for norequest=true in variable] *******************************
changed: [SERVER1 -> localhost]
PLAY RECAP *******************************
SERVER1 : ok=4 changed=3 unreachable=0 failed=0
SERVER2 : ok=1 changed=0 unreachable=0 failed=0
Вот содержимое файла после запуска playbook:
SERVER1 There is a false value
SERVER1 There is a true value.
Вот какой должен быть результат, если пьеса работает так, как я хочу:
SERVER1 There is a false value
SERVER2 There is a true value.
Я чувствую, что часть (или все) моей проблемы может заключаться в том, что я смотрю на это через объектив PowerShell; как в "ДЛЯ КАЖДОГО сервера, получите текст из файла, выполните условную проверку, запишите выходные данные в выходной файл, а затем перейдите к следующему серверу". Возможно ли что-то подобное в пьесе Ansible? Я искал словари как способ решения этой проблемы, но единственные хорошие примеры, которые я мог найти, использовали уже существующие словари или словари, заполненные во время выполнения базовой информацией о сервере.
1 ответ
Мне кажется, что when:
состояние было неправильным. Сопоставление теперь выполняется с помощью регулярного выражения. Протестировал это с этим playbook:
---
- name: Slurps text from file on Windows server
hosts:
- SERVER1
- SERVER2
gather_facts: false
tasks:
- name: Get text
slurp:
src: D:\testsearch.ini
register: norequest
- name: Check for norequest=false in variable
lineinfile:
dest: ./norequest.csv
line: "{{ inventory_hostname }} There is a false value"
state: present
create: true
insertafter: EOF
when: 'norequest["content"] | b64decode | lower | regex_search("norequest *= *false")'
delegate_to: localhost
- name: Check for norequest=true in variable
lineinfile:
dest: ./norequest.csv
line: "{{ inventory_hostname }} There is a true value"
state: present
create: true
insertafter: EOF
when: 'norequest["content"] | b64decode | lower | regex_search("norequest *= *true")'
delegate_to: localhost
Файл testsearch.ini
имеет следующее содержимое в системах:
SERVER1
NoRequest = False
SERVER2
NoRequest = True
Выполнение пьесы с ansible-playbook -i hosts play.yml
дает следующий вывод:
PLAY [SERVER1,SERVER2] *********************************************************
TASK [Get text] ****************************************************************
ok: [SERVER1]
ok: [SERVER2]
TASK [Check for norequest=false in variable] ***********************************
skipping: [SERVER2]
ok: [SERVER1 -> localhost]
TASK [Check for norequest=true in variable] ************************************
skipping: [SERVER1]
ok: [SERVER2 -> localhost]
PLAY RECAP *********************************************************************
SERVER1 : ok=2 changed=0 unreachable=0 failed=0
SERVER2 : ok=2 changed=0 unreachable=0 failed=0
Содержание norequest.csv
после пробега
SERVER1 There is a false value
SERVER2 There is a true value