Невозможно структурировать и прочитать данные из файла include_vars в Ansible - PullRequest
0 голосов
/ 24 января 2020

Я получаю контрольную сумму и режим (разрешения) файла на IP-адресе сервера, используя модуль статистики ansible.

Я создал файл переменной, в котором хранится информация о прошлом файле, как показано ниже:

cat gc.yaml
---
10.9.9.112:
  name: 
    - /tmp/conf/httpd.conf
    - /tmp/conf/extra/httpd-ssl.conf
  hash: 
    - 8g8gf8d8d8ds8s8s7
    - 7t7t7t7t7t7t7t7t
  mode: 
    - 0754
    - 0755    
10.9.9.114:
  name: 
    - /was/conf/httpd.conf
    - /was/conf/extra/httpd-ssl.conf
  hash: 
    - 5r5r5r5r5r5r5r5r
    - 2o2o2o2o2o2o2o2
  mode: 
    - 0754
    - 0750

Это правильный способ создания файла переменной? Под IP у меня есть дубликаты имени, режима и контрольной суммы для httpd.conf и других httpd-ssl.conf. Я не уверен, что это правильная структура. Пожалуйста, предложите сделать это не будет работать, и я могу разработать g c .yaml соответственно.

Мое требование - проверить, соответствует ли статистика текущей игры для определенного файла статистике в g c .yaml

Моя книга воспроизведения выглядит следующим образом:

ansible-playbook /app/test.yml -e files_list="/tmp/conf/httpd.conf,/tmp/conf/extra/httpd-ssl.conf"

  tasks:

   - name: Get stat of the files from `{{ inventory_hostname }}`
     stat:
       path: "{{ item }}"
     register: files_det
     with_items: "{{ files_list.split(',') }}"

   - debug:
       msg: "HERE IS CKSUM_{{ item.stat.checksum }}.HERE IS MODE_{{ item.stat.mode }}"
     with_items: "{{ files_det.results }}"

Ниже я могу прочитать соответствующие данные из g c .yaml и сравнить с переменной files_det, однако я не уверен, как читать данные g c .yaml

   - include_vars:
       file="{{ playbook_dir }}/gc.yaml"
       name=user1

   - debug: var=user1

   - debug:
       msg: "HERE IS THE NAME:{{ item }}"
     with_dict: 10.9.9.112

   - debug:
       msg: "HERE IS THE NAME:{{ item }}.name  HERE is the VALUE:{{ item }}.hash"
     with_dict: "{{ user1 }}"

Учитывая IP-адрес, как мы можем получить режим и контрольную сумму для каждого файла?

Пожалуйста, предложите?

1 Ответ

1 голос
/ 26 января 2020

Не совсем понятно, чего вы пытаетесь достичь sh, поэтому я делаю несколько предположений здесь. Я думаю, вам будет проще, если вы реструктурируете свой файл gc.yaml так, чтобы он выглядел следующим образом:

---
hosts:
  - host: 10.9.9.112
    files:
       - name: /tmp/conf/httpd.conf
         hash: 8g8gf8d8d8ds8s8s
         mode: 0754
       - name: /tmp/conf/extra/httpd-ssl.conf
         hash: 7t7t7t7t7t7t7t7t
         mode: 0755

  - host: 10.9.9.114
    files:
       - name: /was/conf/httpd.conf
         hash: 5r5r5r5r5r5r5r5r
         mode: 0754
       - name: /was/conf/extra/httpd-ssl.conf
         hash: 2o2o2o2o2o2o2o2
         mode: 0750

У нас есть ключ верхнего уровня hosts, значением которого является список. Каждый элемент списка представляет собой словарь с ключом host, который имеет имя хоста, и ключом files, который имеет список файлов.

Эта структура делает данные полезными с Ansible 's subelements filter.

Например, с учетом следующей пьесы:

---
- name: Enable Site
  hosts: localhost
  gather_facts: false
  tasks:
    - include_vars:
        file: "{{ playbook_dir }}/gc.yaml"
        name: user1

    - debug:
        msg: "file {{ item.1.name }} on host {{ item.0.host }} has hash {{ item.1.hash }}"
      loop: "{{ user1.hosts|subelements('files') }}"
      loop_control:
        label: "{{ item.0.host }}:{{ item.1.name }}"

Мы получаем следующий вывод:


PLAY [Enable Site] *******************************************************************

TASK [include_vars] ******************************************************************
ok: [localhost]

TASK [debug] *************************************************************************
ok: [localhost] => (item=10.9.9.112:/tmp/conf/httpd.conf) => {
    "msg": "file /tmp/conf/httpd.conf on host 10.9.9.112 has hash 8g8gf8d8d8ds8s8s"
}
ok: [localhost] => (item=10.9.9.112:/tmp/conf/extra/httpd-ssl.conf) => {
    "msg": "file /tmp/conf/extra/httpd-ssl.conf on host 10.9.9.112 has hash 7t7t7t7t7t7t7t7t"
}
ok: [localhost] => (item=10.9.9.114:/was/conf/httpd.conf) => {
    "msg": "file /was/conf/httpd.conf on host 10.9.9.114 has hash 5r5r5r5r5r5r5r5r"
}
ok: [localhost] => (item=10.9.9.114:/was/conf/extra/httpd-ssl.conf) => {
    "msg": "file /was/conf/extra/httpd-ssl.conf on host 10.9.9.114 has hash 2o2o2o2o2o2o2o2"
}

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

The * Фильтр 1021 * предоставляет нашему l oop список кортежей, так что первый элемент кортежа перебирает элементы списка hosts, а второй элемент перебирает элементы списка files для текущего хост.

То есть, первый раз, когда мы перебираем l oop, item содержит:

- host: 10.9.9.12
  files:
    - name: /tmp/conf/httpd.conf
      hash: 8g8gf8d8d8ds8s8s
      mode: 0754
    - name: /tmp/conf/extra/httpd-ssl.conf
      hash: 7t7t7t7t7t7t7t7t
      mode: 0755
- name: /tmp/conf/httpd.conf
  hash: 8g8gf8d8d8ds8s8s
  mode: 0754

И второй раз:

- host: 10.9.9.12
  files:
    - name: /tmp/conf/httpd.conf
      hash: 8g8gf8d8d8ds8s8s
      mode: 0754
    - name: /tmp/conf/extra/httpd-ssl.conf
      hash: 7t7t7t7t7t7t7t7t
      mode: 0755
- name: /tmp/conf/extra/httpd-ssl.conf
  hash: 7t7t7t7t7t7t7t7t
  mode: 0755

И и так далее.


Если вы не собираетесь зацикливаться на данных, но вместо этого хотите иметь возможность получить ха sh файла с заданным именем файла, то структурируйте ваши данные следующим образом это вместо этого:

---
10.9.9.112:
   /tmp/conf/httpd.conf:
     hash: 8g8gf8d8d8ds8s8s
     mode: 0754
   /tmp/conf/extra/httpd-ssl.conf:
     hash: 7t7t7t7t7t7t7t7t
     mode: 0755

10.9.9.114:
   /was/conf/httpd.conf:
     hash: 5r5r5r5r5r5r5r5r
     mode: 0754
   /was/conf/extra/httpd-ssl.conf:
     hash: 2o2o2o2o2o2o2o2
     mode: 0750

Теперь ваши имена файлов являются словарными ключами, поэтому вы можете запросить user1[<host>][<filename>], например:

---
- name: Enable Site
  hosts: localhost
  gather_facts: false
  tasks:
    - include_vars:
        file: "{{ playbook_dir }}/gc.yaml"
        name: user1

    - debug:
        msg: "file {{ item.file }} on host {{ item.host }} has hash {{ user1[item.host][item.file].hash }}"
      loop:
        - host: 10.9.9.112
          file: /tmp/conf/extra/httpd-ssl.conf

Выше приведены результаты:

TASK [debug] *****************************************************************************************************************************************************************
ok: [localhost] => (item={'host': '10.9.9.112', 'file': '/tmp/conf/extra/httpd-ssl.conf'}) => {
    "msg": "file /tmp/conf/extra/httpd-ssl.conf on host 10.9.9.112 has hash 7t7t7t7t7t7t7t7t"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...