Ansible : 속성별로 목록 필터링
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" }}
구문이 잘못되었다는 것을 알고 있지만 아이디어를 얻었습니다.
Ansible에 jmespath 쿼리 지원을 추가하여 이러한 종류의 상황을 더 쉽게 만들 수 있는 pull 요청 (Ansible 2.2 이상에서 사용 가능)을 제출했습니다 . 귀하의 경우에는 다음과 같이 작동합니다.
- debug: msg="{{ addresses | json_query(\"private_man[?type=='fixed'].addr\") }}"
반환됩니다 :
ok: [localhost] => {
"msg": [
"172.16.1.100"
]
}
사전 목록을 필터링하려면 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"
}
참고 URL : https://stackoverflow.com/questions/31895602/ansible-filter-a-list-by-its-attributes
'program tip' 카테고리의 다른 글
Spring : Map 또는 Properties 객체로 모든 환경 속성에 액세스 (0) | 2020.11.17 |
---|---|
PowerPivot, PowerQuery 및 PowerBI의 차이점 (0) | 2020.11.17 |
@RequestBody MultiValueMap에 대해 콘텐츠 유형 'application / x-www-form-urlencoded; charset = UTF-8'이 지원되지 않습니다. (0) | 2020.11.17 |
800px 이후 scrollDown에 div 표시 (0) | 2020.11.16 |
ImageMagick / RMagick-RMagick 2.13.1을 설치할 수 없습니다. (0) | 2020.11.16 |