저는 ansible 플레이북을 작성 중입니다. 이 플레이북에서는 read_csv 함수를 사용하여 csv를 목록으로 읽어옵니다.
csv 파일의 형식은 다음과 같습니다.
Name;Hostname;fqdn;Typ;IPAddress
aaa_nfs_db;aaa;aaa.domain.tld;db;10.1.1.1
aaa_nfs_log;aaa;aaa.domain.tld;log;10.2.2.2
bbb_nfs_db;bbb;bbb.domain.tld;db;10.3.3.3
bbb_nfs_log;bbb;bbb.domain.tld;log;10.4.4.4
aaa.domain.tld에서 플레이북을 실행 중이고 10.1.1.1을 한 변수에 할당하고 10.2.2.2를 다른 변수에 할당하고 싶습니다.
어떻게 해야 하나요?
awk에서는 다음과 같이 보입니다.
$ awk -F";" '$3=="aaa.domain.tld"&&$4=="db"{print $5;}' test.csv
10.1.1.1
$
목록을 필터링하려면 플레이북 방식이 필요합니다.
진심으로 당신의
마리오
답변1
해당 메소드를 사용하여 csv를 변수에 로드한 후read_csv
기준 치수selectattr
, 일반적인 필터링 도구( , , ...)를 사용하여 map
목록의 값을 필터링하고 선택할 수 있습니다.
데모 를 위해 위 파일을 files/example.csv
.playbook.yml
---
- name: Parse csv and filtering demo
hosts: localhost
gather_facts: false
tasks:
- name: read in our csv file in a list
read_csv:
path: files/example.csv
delimiter: ;
register: hosts_info
- name: Show the entire info we parsed (if running with `-v`)
debug:
var: hosts_info.list
verbosity: 1
- name: Show ip depending on fqdn and type
vars:
ip: >-
{{
hosts_info.list
| selectattr('fqdn', '==', item.fqdn)
| selectattr('Typ', '==', item.type)
| map(attribute='IPAddress')
| list
| first
}}
debug:
msg: "The ip of {{ item.fqdn }} for type {{ item.type }} is {{ ip }}"
loop:
- fqdn: aaa.domain.tld
type: db
- fqdn: aaa.domain.tld
type: log
-v
주어진 ( 중간 디버깅을 보려면 실행 )
$ ansible-playbook playbook.yml
PLAY [Parse csv and filtering demo] ****************************************************************************************************************************************************************************************************
TASK [read in our csv file in a list] **************************************************************************************************************************************************************************************************
ok: [localhost]
TASK [Show the entire info we parsed (if running with `-v`)] ***************************************************************************************************************************************************************************
skipping: [localhost]
TASK [Show ip depending on fqdn and type] **********************************************************************************************************************************************************************************************
ok: [localhost] => (item={'fqdn': 'aaa.domain.tld', 'type': 'db'}) => {
"msg": "The ip of aaa.domain.tld for type db is 10.1.1.1"
}
ok: [localhost] => (item={'fqdn': 'aaa.domain.tld', 'type': 'log'}) => {
"msg": "The ip of aaa.domain.tld for type log is 10.2.2.2"
}
PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0