Ansible에 등록 된 “network”라는 변수가 있습니다.
{
"addresses": {
"private_ext": [
{
"type": "fixed",
"addr": "172.16.2.100"
}
],
"private_man": [
{
"type": "fixed",
"addr": "172.16.1.100"
},
{
"type": "floating",
"addr": "10.90.80.10"
}
]
}
}
다음과 같이 type = “floating”으로 IP 주소 ( “addr”)를 얻을 수 있습니까?
- debug: var={{ network.addresses.private_man | filter type="fixed" | get "addr" }}
구문이 잘못되었다는 것을 알고 있지만 아이디어를 얻었습니다.
답변
답변
딕셔너리 목록을 필터링하려면 equalto 테스트 와 함께 selectattr 필터를 사용할 수 있습니다 .
network.addresses.private_man | selectattr("type", "equalto", "fixed")
위의 버전에는 Jinja2 v2.8 이상이 필요합니다 (Ansible 버전에 관계없이).
Ansible 에는match
search
정규식을 사용 하는 테스트 및 도 있습니다 .
match
문자열에서 완전히 일치search
해야하는 반면 문자열 내부에서 일치해야합니다.
network.addresses.private_man | selectattr("type", "match", "^fixed$")
딕셔너리 목록을 문자열 목록으로 줄여서 addr
필드 목록 만 가져 오려면 map 필터를 사용할 수 있습니다 .
... | map(attribute='addr') | list
또는 쉼표로 구분 된 문자열을 원하는 경우 :
... | map(attribute='addr') | join(',')
결합하면 다음과 같이 보일 것입니다.
- debug: msg={{ network.addresses.private_man | selectattr("type", "equalto", "fixed") | map(attribute='addr') | join(',') }}
답변
반드시 더 나은 것은 아니지만 여기에 옵션이있는 것이 좋기 때문에 다음을 사용하여 수행하는 방법이 있습니다. Jinja 문을 같습니다.
- debug:
msg: "{% for address in network.addresses.private_man %}\
{% if address.type == 'fixed' %}\
{{ address.addr }}\
{% endif %}\
{% endfor %}"
또는 모두 한 줄에 입력하려면 다음을 수행하십시오.
- debug:
msg: "{% for address in network.addresses.private_man if address.type == 'fixed' %}{{ address.addr }}{% endfor %}"
다음을 반환합니다.
ok: [localhost] => {
"msg": "172.16.1.100"
}