Ansible
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 $
我需要 ansible Playbook 方式來過濾列表。
您忠誠的
馬里奧
使用相應
read_csv
模組將 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