Ansible: добавление значений к переменной в цикле - PullRequest
0 голосов
/ 25 октября 2018

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

  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

Исходя из моих результатов, похоже, что книга воспроизведения отбирает текст из файлов на обоих тестовых серверах и добавляет все это в переменную, а затем выполняет условную проверку на одном изсерверы (поскольку сама задача делегируется локальному хосту) и выводит результаты в файл, как если бы они все были получены от 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.

Вот какой должен быть результат, если playbook работал так, как я хочу:

SERVER1 There is a false value
SERVER2 There is a true value.

Я чувствую, чточасть (или все)моя проблема может быть в том, что я смотрю на это через объектив PowerShell;как в «ДЛЯ КАЖДОГО сервера, получите текст из файла, выполните условную проверку, запишите выходные данные в выходной файл, а затем перейдите к следующему серверу».Возможно ли что-то подобное в пьесе Ansible?Я искал словари как способ решения этой проблемы, но единственные хорошие примеры, которые я мог найти, использовали уже существующие словари или словари, заполненные во время выполнения базовой информацией о сервере.

1 Ответ

0 голосов
/ 26 октября 2018

Мне кажется, что условие when: было неправильным.Сопоставление теперь выполняется с помощью регулярного выражения.Протестировано с помощью этой пьесы:

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

Выполнение playbook с помощью 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
...