Ansible: сохранить имена хостов и результаты команды linux в формате словаря - PullRequest
1 голос
/ 10 июля 2020

Я хочу сохранить имя хоста и результаты команды linux в формате словаря. Проблема в том, что я не могу успешно получить формат словаря, и новая строка, сохраненная в файле results.txt, заменит предыдущие строки.

---
- hosts: "{{variable_host | default('lsbxdmss001')}}"
    tasks:
  - name: Check Redhat version for selected servers
    shell:
      cmd: rpm --query redhat-release-server
      warn: False
    register: myshell_output

  - debug: var=myshell_output

  - name: set fact
    set_fact: output = "{{item.0}}:{{item.1}}"
    with_together:
      - groups['{{variable_host}}']
      - "{{myshell_output.stdout}}"
    register: output

  - debug: var=output

  - name: copy the output to results.txt
    copy:
      content: "{{output}}"
      dest: results.txt
    delegate_to: localhost

1 Ответ

0 голосов
/ 10 июля 2020

Похоже, у вас четыре проблемы:

  1. Создание словаря кажется странным, словарь в python заключен в фигурные скобки { ... } Итак, вы строчите словарь

    "{{item.0}}:{{item.1}}"  
    

    Должно быть

    "{{ {item.0: item.1} }}"
    
  2. Добавление в файл в Ansible выполняется через модуль lineinfile, а не через copy one.

  3. Ваш l oop на самом деле не имеет смысла, поскольку Ansible уже выполняет каждую задачу на всех хостах, поэтому у вас есть только одна информация также происходит из-за этого: вы продолжаете отменять факт output, чтобы сделать это в своей пробной версии.

  4. По той же причине, что и выше, вместо вашего with_together l oop, вы должны использовать специальную переменную inventory_hostname, так как это

    Имя инвентаря для «текущего» хоста, который повторяется в игре

    Источник: https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html#special -переменные

Итак, после вашей команды shell, здесь должен б e следующая задача:

- lineinfile:
    path: results.txt
    line: "{{ {inventory_hostname: myshell_output.stdout} | string }}"
    create: yes
  delegate_to: localhost

Помните, что фильтр string был добавлен для преобразования словаря в строку для записи ее в файл без Ansible выдачи предупреждения.

Примером playbook будет:

- hosts: all
  gather_facts: no
  
  tasks:
    - name: Creating a fake shell result
      shell:
        cmd: echo 'Linux Vlersion XYZ {{ inventory_hostname }}'
      register: shell_output

    - lineinfile:
        path: results.txt
        line: "{{ {inventory_hostname: shell_output.stdout} | string }}"
        create: yes
      delegate_to: localhost

Что дает резюме:

PLAY [all] ******************************************************************************************************************************************

TASK [Creating a fake shell result] *****************************************************************************************************************
changed: [host2]
changed: [host1]

TASK [lineinfile] ***********************************************************************************************************************************
changed: [host1 -> localhost]
changed: [host2 -> localhost]

PLAY RECAP ******************************************************************************************************************************************
host1                      : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host2                      : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

И заполните results.txt файл с:

{'host1': 'Linux Vlersion XYZ host1'}
{'host2': 'Linux Vlersion XYZ host2'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...