如何将一些项目值转换为新的项目值?
How can I transform some items values into new items value?
这是我的变量:
zones:
- hostname: host10
cname: "{{cname1|default(omit)}}"
zone: ["v120","v121","linux"]
ips: 8
- hostname: host11
cname: "{{cname2|default(omit)}}"
zone: ["v120","v121"]
ips: 10
- hostname: host12
zone: [linux]
ips: 88
如何在 zones.zone 上构建几乎没有替换的相同变量(将 v120 替换为 120,将 v121 替换为 121,将 linux 替换为 v120):
zones:
- hostname: host10
cname: "{{cname1|default(omit)}}"
zone: ["120","121","120"]
ips: 8
- hostname: host11
cname: "{{cname2|default(omit)}}"
zone: ["120","121"]
ips: 10
- hostname: host12
zone: [120]
ips: 88
我尝试了很多与一些过滤器的组合,特别是“组合”和“regex_replace”
regex_replace('^v(.*)$', '\1')
但从未成功获得最终objective。做起来好像很简单,我一定漏掉了什么...
创建字典替换并迭代区域。在每次迭代中提取替换 zone,将字典与 item 组合并连接列表 zones2。例如
- set_fact:
zones2: "{{ zones2|default([]) +
[item|combine({'zone': zone})] }}"
loop: "{{ zones }}"
vars:
zone: "{{ item.zone|map('extract', substitute)|list }}"
substitute:
v120: 120
v121: 121
linux: 120
- debug:
var: zones2
给予
zones2:
- hostname: host10
ips: 8
zone:
- 120
- 121
- 120
- hostname: host11
ips: 10
zone:
- 120
- 121
- hostname: host12
ips: 88
zone:
- 120
映射regex_replace
- set_fact:
zones2: "{{ zones2|default([]) +
[item|combine({'zone': zone})] }}"
loop: "{{ zones }}"
vars:
zone: "{{ item.zone|
map('regex_replace', regex, replace)|
map('regex_replace', regex2, replace2)|
list }}"
regex: '^v(.*)$'
replace: ''
regex2: '^linux$'
replace2: '120'
- debug:
var: zones2
给予
zones2:
- hostname: host10
ips: 8
zone:
- '120'
- '121'
- '120'
- hostname: host11
ips: 10
zone:
- '120'
- '121'
- hostname: host12
ips: 88
zone:
- '120'
"了解提取过滤器的作用"
显示 extract 过滤器
的结果
- debug:
msg: |
{{ item.zone|to_yaml }}{{ zone|to_yaml }}
loop: "{{ zones }}"
vars:
zone: "{{ item.zone|map('extract', substitute)| list }}"
substitute:
v120: 120
v121: 121
linux: 120
给出(删节)
msg: |-
[v120, v121, linux]
[120, 121, 120]
msg: |-
[v120, v121]
[120, 121]
msg: |-
[linux]
[120]
"了解组合解决方案的作用"
显示 combine 过滤器
的结果
- debug:
msg: "{{ item|combine({'zone': zone})|
to_yaml}}"
loop: "{{ zones }}"
vars:
zone: "{{ item.zone|map('extract', substitute)| list }}"
substitute:
v120: 120
v121: 121
linux: 120
给出(删节)
msg: |-
cname: __omit_place_holder__3938838202c238b505bfc39af57a09b4fe9972f6
hostname: host10
ips: 8
zone: [120, 121, 120]
msg: |-
cname: __omit_place_holder__3938838202c238b505bfc39af57a09b4fe9972f6
hostname: host11
ips: 10
zone: [120, 121]
msg: |-
hostname: host12
ips: 88
zone: [120]
""zones2": "[AnsibleUndefined, AnsibleUndefined]" 你怎么解释?"
下面的代码按预期工作
- set_fact:
zones2: "{{ item.zone|map('extract', substitute)|list }}"
loop: "{{ zones }}"
register: zones_list
vars:
substitute:
v120: 120
v121: 121
linux: 120
- debug:
msg: "{{ zones_list.results|map(attribute='ansible_facts')|list|
to_yaml }}"
给出(删节)
msg: |-
- zones2: [120, 121, 120]
- zones2: [120, 121]
- zones2: [120]
这是我的变量:
zones:
- hostname: host10
cname: "{{cname1|default(omit)}}"
zone: ["v120","v121","linux"]
ips: 8
- hostname: host11
cname: "{{cname2|default(omit)}}"
zone: ["v120","v121"]
ips: 10
- hostname: host12
zone: [linux]
ips: 88
如何在 zones.zone 上构建几乎没有替换的相同变量(将 v120 替换为 120,将 v121 替换为 121,将 linux 替换为 v120):
zones:
- hostname: host10
cname: "{{cname1|default(omit)}}"
zone: ["120","121","120"]
ips: 8
- hostname: host11
cname: "{{cname2|default(omit)}}"
zone: ["120","121"]
ips: 10
- hostname: host12
zone: [120]
ips: 88
我尝试了很多与一些过滤器的组合,特别是“组合”和“regex_replace”
regex_replace('^v(.*)$', '\1')
但从未成功获得最终objective。做起来好像很简单,我一定漏掉了什么...
创建字典替换并迭代区域。在每次迭代中提取替换 zone,将字典与 item 组合并连接列表 zones2。例如
- set_fact:
zones2: "{{ zones2|default([]) +
[item|combine({'zone': zone})] }}"
loop: "{{ zones }}"
vars:
zone: "{{ item.zone|map('extract', substitute)|list }}"
substitute:
v120: 120
v121: 121
linux: 120
- debug:
var: zones2
给予
zones2:
- hostname: host10
ips: 8
zone:
- 120
- 121
- 120
- hostname: host11
ips: 10
zone:
- 120
- 121
- hostname: host12
ips: 88
zone:
- 120
映射regex_replace
- set_fact:
zones2: "{{ zones2|default([]) +
[item|combine({'zone': zone})] }}"
loop: "{{ zones }}"
vars:
zone: "{{ item.zone|
map('regex_replace', regex, replace)|
map('regex_replace', regex2, replace2)|
list }}"
regex: '^v(.*)$'
replace: ''
regex2: '^linux$'
replace2: '120'
- debug:
var: zones2
给予
zones2:
- hostname: host10
ips: 8
zone:
- '120'
- '121'
- '120'
- hostname: host11
ips: 10
zone:
- '120'
- '121'
- hostname: host12
ips: 88
zone:
- '120'
"了解提取过滤器的作用"
显示 extract 过滤器
的结果 - debug:
msg: |
{{ item.zone|to_yaml }}{{ zone|to_yaml }}
loop: "{{ zones }}"
vars:
zone: "{{ item.zone|map('extract', substitute)| list }}"
substitute:
v120: 120
v121: 121
linux: 120
给出(删节)
msg: |-
[v120, v121, linux]
[120, 121, 120]
msg: |-
[v120, v121]
[120, 121]
msg: |-
[linux]
[120]
"了解组合解决方案的作用"
显示 combine 过滤器
的结果 - debug:
msg: "{{ item|combine({'zone': zone})|
to_yaml}}"
loop: "{{ zones }}"
vars:
zone: "{{ item.zone|map('extract', substitute)| list }}"
substitute:
v120: 120
v121: 121
linux: 120
给出(删节)
msg: |-
cname: __omit_place_holder__3938838202c238b505bfc39af57a09b4fe9972f6
hostname: host10
ips: 8
zone: [120, 121, 120]
msg: |-
cname: __omit_place_holder__3938838202c238b505bfc39af57a09b4fe9972f6
hostname: host11
ips: 10
zone: [120, 121]
msg: |-
hostname: host12
ips: 88
zone: [120]
""zones2": "[AnsibleUndefined, AnsibleUndefined]" 你怎么解释?"
下面的代码按预期工作
- set_fact:
zones2: "{{ item.zone|map('extract', substitute)|list }}"
loop: "{{ zones }}"
register: zones_list
vars:
substitute:
v120: 120
v121: 121
linux: 120
- debug:
msg: "{{ zones_list.results|map(attribute='ansible_facts')|list|
to_yaml }}"
给出(删节)
msg: |-
- zones2: [120, 121, 120]
- zones2: [120, 121]
- zones2: [120]