ansible 映射一个属性
ansible mapping an attribute back
我可以在搜索字典列表时获取值,但无法使用 selectattr 并将值映射回来。
我离开的任何线索
- hosts: all
gather_facts: no
vars:
lacp_groups:
- master: lacp0
network: 10.65.100.0/24
gateway: 10.65.100.1
dns4:
- 10.65.100.10
- 10.65.100.11
interfaces:
- em1
- em2
- master: lacp1
network: 10.65.120.0/24
gateway: 10.65.120.1
dns4:
- 10.65.100.10
- 10.65.100.11
interfaces:
- em3
- em4
tasks:
- debug:
var: lacp_groups[0]
- debug:
msg: "{{ item.master }}"
loop: "{{ lacp_groups}}"
loop_control:
label: "{{item.master}}"
when: "'em1' in item.interfaces"
- set_fact:
#myvar: "dns"
myvar: "{{ lacp_groups | selectattr('interfaces','search','em1') | map(attribute='master') | join() }}"
- debug:
var: myvar
OutPut back 正在说以下内容
TASK [debug] ****************************************************************************************************************************************
task path: /mnt/c/users/jak_s/test12.yml:28
ok: [localhost] => (item=lacp0) => {
"msg": "lacp0"
}
skipping: [localhost] => (item=lacp1) => {
"skip_reason": "Conditional result was False"
}
TASK [set_fact] *************************************************************************************************************************************
task path: /mnt/c/users/jak_s/test12.yml:34
fatal: [localhost]: FAILED! => {
***"msg": "Unexpected templating type error occurred*** on ({{ lacp_groups | selectattr('interfaces','search','em1') | map(attribute='master') | join() }}): expected string or buffer"
}
PLAY RECAP ******************************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=1
我知道我可以通过这样做来检索对象
- set_fact:
myvar2: "{{ item.master }}"
loop: "{{ lacp_groups}}"
loop_control:
label: "{{item.master}}"
when: "'em3' in item.interfaces"
- debug:
var: myvar2
但我想找出在 ansible 中执行此操作的 selectattr 和 map 方法
猜测:您使用的是 ansible < 2.10。在这种情况下,您必须将 map 函数的结果转换为 list:
myvar: "{{ lacp_groups | selectattr('interfaces','search','em1') | map(attribute='master') | list | join() }}"
ansible >= 2.10 不需要这个
我可以在搜索字典列表时获取值,但无法使用 selectattr 并将值映射回来。 我离开的任何线索
- hosts: all
gather_facts: no
vars:
lacp_groups:
- master: lacp0
network: 10.65.100.0/24
gateway: 10.65.100.1
dns4:
- 10.65.100.10
- 10.65.100.11
interfaces:
- em1
- em2
- master: lacp1
network: 10.65.120.0/24
gateway: 10.65.120.1
dns4:
- 10.65.100.10
- 10.65.100.11
interfaces:
- em3
- em4
tasks:
- debug:
var: lacp_groups[0]
- debug:
msg: "{{ item.master }}"
loop: "{{ lacp_groups}}"
loop_control:
label: "{{item.master}}"
when: "'em1' in item.interfaces"
- set_fact:
#myvar: "dns"
myvar: "{{ lacp_groups | selectattr('interfaces','search','em1') | map(attribute='master') | join() }}"
- debug:
var: myvar
OutPut back 正在说以下内容
TASK [debug] ****************************************************************************************************************************************
task path: /mnt/c/users/jak_s/test12.yml:28
ok: [localhost] => (item=lacp0) => {
"msg": "lacp0"
}
skipping: [localhost] => (item=lacp1) => {
"skip_reason": "Conditional result was False"
}
TASK [set_fact] *************************************************************************************************************************************
task path: /mnt/c/users/jak_s/test12.yml:34
fatal: [localhost]: FAILED! => {
***"msg": "Unexpected templating type error occurred*** on ({{ lacp_groups | selectattr('interfaces','search','em1') | map(attribute='master') | join() }}): expected string or buffer"
}
PLAY RECAP ******************************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=1
我知道我可以通过这样做来检索对象
- set_fact:
myvar2: "{{ item.master }}"
loop: "{{ lacp_groups}}"
loop_control:
label: "{{item.master}}"
when: "'em3' in item.interfaces"
- debug:
var: myvar2
但我想找出在 ansible 中执行此操作的 selectattr 和 map 方法
猜测:您使用的是 ansible < 2.10。在这种情况下,您必须将 map 函数的结果转换为 list:
myvar: "{{ lacp_groups | selectattr('interfaces','search','em1') | map(attribute='master') | list | join() }}"
ansible >= 2.10 不需要这个