Ansible

ansible 從列表中選擇一個值

  • March 28, 2021

我正在寫一本可靠的劇本。在本劇本中,我使用函式 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 載入到變數中後,您可以使用常用過濾工具(、、…)過濾和選擇列表中selectattrmap

對於展示,我將您的上述文件放在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

引用自:https://unix.stackexchange.com/questions/638583