Я пытаюсь установить записи / etc / hosts в playbook.
Я управляю тремя хешами списков: common_stubs, env_stubs и host_stubs.
пример того, с чем я работаю здесь
common_stubs:
"127.0.0.1":
- localhost
env_stubs:
"127.0.0.1":
- someservice.mydomain
host_stubs: {}
Я хочу объединить их, чтобы получить
combined_stubs:
"127.0.0.1":
- localhost
- someservice.mydomain
Это то, что я сейчас делаю
- name: "Configure /etc/hosts"
lineinfile:
path: /etc/hosts
regex: "{{ '^' + item.key + '.*$' }}"
line: "{{ item.key + ' ' + ' '.join(item.value) }}"
state: "{% if item.value | length > 0 %}present{% else %}absent{% endif %}"
loop: "{{ common_stubs | combine(env_stubs, host_stubs, recursive=True) | dict2items }}"
become: true
но массив в env_stubs
переопределяет массив в common_stubs
Давайте сначала создадим список IP-адресов
- set_fact:
list_ip: "{{ list_ip|default([]) + item }}"
loop:
- "{{ common_stubs.keys()|list }}"
- "{{ env_stubs.keys()|list }}"
- "{{ host_stubs.keys()|list }}"
- set_fact:
list_ip: "{{ list_ip|flatten|unique }}"
затем зациклите список и комбинировать словарь
- set_fact:
combined_stubs: "{{ combined_stubs|default({})|
combine({item: [[common_stubs[item]|default([])] +
[env_stubs[item]|default([])] +
[host_stubs[item]|default([])]]|
flatten}) }}"
loop: "{{ list_ip }}"
дайте
"combined_stubs": {
"127.0.0.1": [
"localhost",
"someservice.mydomain"
]
}
$ cat filter_plugins/dict_utils.py
def dict_merge_lossless(x, y):
d = x.copy()
d.update(y)
for key, value in d.items():
if key in x and key in y:
d[key] = [value , x[key]]
return d
class FilterModule(object):
''' Ansible filters. Interface to Python dictionary methods.'''
def filters(self):
return {
'dict_merge_lossless' : dict_merge_lossless
}
Тогда задачи ниже
- set_fact:
combined_stubs: "{{ common_stubs|
dict_merge_lossless(env_stubs)|
dict_merge_lossless(host_stubs) }}"
- debug:
var: combined_stubs
дайте
combined_stubs:
127.0.0.1:
- - someservice.mydomain
- - localhost