Ansible: добавление значений к переменной в цикле

Я работаю над пьесой, которая делает следующее:

  1. Идет по указанному пути на каждом сервере Windows
  2. Отбрасывает текст из файла и добавляет его в переменную
  3. Выполняет проверку переменной, чтобы увидеть, существует ли строка текста
  4. Записывает результаты в файл на основе результата.

Вот код, который у меня есть для этого:

---
- 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
Другие вопросы по тегам