Не совсем понятно, чего вы пытаетесь достичь 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"
}