为嵌套字典列表中的值添加前缀



我想在membersname中添加这个嵌套的字典前缀列表:

pool:
- name: "OPENSTACK_POC_POOL_KEYSTONE_SERVICE"
port: 5000
members:
- name: "OPENSTACK_ECPOCMCTL01_OPENS_KEYSTONE_CONTAINER_097AD5B5"
host: 10.5.1.2
- name: "OPENSTACK_ECPOCMCTL02_OPENS_KEYSTONE_CONTAINER"
host: 10.5.3.3
- name: "OPENSTACK_ECPOCMCTL03_OPENS_KEYSTONE_CONTAINER"
host: 10.3.1.7
state: present

- name: "OPENSTACK_POC_POOL_CINDER_API"
port: 8776
members:
- name: "OPENSTACK_ECPOCMCTL01_OPENS"
host: 10.5.2.9
- name: "OPENSTACK_ECPOCMCTL02_OPENS"
host: 10.3.2.168
- name: "OPENSTACK_ECPOCMCTL03_OPENS"
host: 10.3.1.6
state: present

就像这样:

pool:
- name: "OPENSTACK_POC_POOL_KEYSTONE_SERVICE"
port: 5000
members:
- name: "ANSIBLE-OPENSTACK_ECPOCMCTL01_OPENS_KEYSTONE_CONTAINER"
host: 10.5.1.2
- name: "ANSIBLE-OPENSTACK_ECPOCMCTL02_OPENS_KEYSTONE_CONTAINER"
host: 10.5.3.3
- name: "ANSIBLE-OPENSTACK_ECPOCMCTL03_OPENS_KEYSTONE_CONTAINER"
host: 10.3.1.7
state: present
- name: "OPENSTACK_POC_POOL_CINDER_API"
port: 8776
members:
- name: "ANSIBLE-OPENSTACK_ECPOCMCTL01_OPENS"
host: 10.5.2.9
- name: "ANSIBLE-OPENSTACK_ECPOCMCTL02_OPENS"
host: 10.3.2.168
- name: "ANSIBLE-OPENSTACK_ECPOCMCTL03_OPENS"
host: 10.3.1.6
state: present

我有更多的方法来达到它,但我会给你看我最后的版本。

我尝试了这个,但是由于有两个name键,它忽略了其中一个:

- set_fact:
data2: "{{ data.members |combine({'name': 'ANSIBLE-' }) }}"
- name: with_nested
set_fact:
data2: [{'name': "{{item.0.name}}", 'members': [{'host': "{{item.1.host}}"}]}]
with_subelements:
- "{{ data }}"
- "members"
register: test
- debug:
msg: "{{ item.members.0.name | regex_replace('^.*', 'a\1') }}"
loop: "{{ data | ansible.utils.remove_keys(target=['monitor']) }}"

这个想法是将它们组合起来,并将名称与前缀更改为新字典,但我仍然想不出来。
我使用的是Ansible 2.13.1版本,所以这里不能使用map更新。

更新名称。声明变量

pool_names: "{{ pool|json_query(pool_names_query) }}"
pool_names_query: "[].{members: members[].{name: ['ANSIBLE', name].join('-',@),
host: host}}"

pool_names:
- members:
- host: 10.5.1.2
name: ANSIBLE-OPENSTACK_ECPOCMCTL01_OPENS_KEYSTONE_CONTAINER_097AD5B5
- host: 10.5.3.3
name: ANSIBLE-OPENSTACK_ECPOCMCTL02_OPENS_KEYSTONE_CONTAINER
- host: 10.3.1.7
name: ANSIBLE-OPENSTACK_ECPOCMCTL03_OPENS_KEYSTONE_CONTAINER
- members:
- host: 10.5.2.9
name: ANSIBLE-OPENSTACK_ECPOCMCTL01_OPENS
- host: 10.3.2.168
name: ANSIBLE-OPENSTACK_ECPOCMCTL02_OPENS
- host: 10.3.1.6
name: ANSIBLE-OPENSTACK_ECPOCMCTL03_OPENS

合并更新

pool_update: "{{ pool|zip(pool_names)|map('combine')|list }}"

给出了更新后的池

pool_update:
- members:
- host: 10.5.1.2
name: ANSIBLE-OPENSTACK_ECPOCMCTL01_OPENS_KEYSTONE_CONTAINER_097AD5B5
- host: 10.5.3.3
name: ANSIBLE-OPENSTACK_ECPOCMCTL02_OPENS_KEYSTONE_CONTAINER
- host: 10.3.1.7
name: ANSIBLE-OPENSTACK_ECPOCMCTL03_OPENS_KEYSTONE_CONTAINER
name: OPENSTACK_POC_POOL_KEYSTONE_SERVICE
port: 5000
state: present
- members:
- host: 10.5.2.9
name: ANSIBLE-OPENSTACK_ECPOCMCTL01_OPENS
- host: 10.3.2.168
name: ANSIBLE-OPENSTACK_ECPOCMCTL02_OPENS
- host: 10.3.1.6
name: ANSIBLE-OPENSTACK_ECPOCMCTL03_OPENS
name: OPENSTACK_POC_POOL_CINDER_API
port: 8776
state: present

用于测试的完整剧本示例

- hosts: localhost
vars:
pool:
- name: "OPENSTACK_POC_POOL_KEYSTONE_SERVICE"
port: 5000
members:
- name: "OPENSTACK_ECPOCMCTL01_OPENS_KEYSTONE_CONTAINER_097AD5B5"
host: 10.5.1.2
- name: "OPENSTACK_ECPOCMCTL02_OPENS_KEYSTONE_CONTAINER"
host: 10.5.3.3
- name: "OPENSTACK_ECPOCMCTL03_OPENS_KEYSTONE_CONTAINER"
host: 10.3.1.7
state: present
- name: "OPENSTACK_POC_POOL_CINDER_API"
port: 8776
members:
- name: "OPENSTACK_ECPOCMCTL01_OPENS"
host: 10.5.2.9
- name: "OPENSTACK_ECPOCMCTL02_OPENS"
host: 10.3.2.168
- name: "OPENSTACK_ECPOCMCTL03_OPENS"
host: 10.3.1.6
state: present
pool_names: "{{ pool|json_query(pool_names_query) }}"
pool_names_query: "[].{members: members[].{name: ['ANSIBLE', name].join('-',@),
host: host}}"
pool_update: "{{ pool|zip(pool_names)|map('combine')|list }}"
tasks:
- debug:
var: pool_names
- debug:
var: pool_update

最新更新