我們知道ansible中的hostvars變量可以訪問其他主機的變量秽荤,例如我目前在localhost上甜奄,我想訪問controller1主機上的cmd變量的輸出值,可以使用{{ hostvars['controller1']['cmd'].stdout_lines }}窃款,現(xiàn)在有一種新需求课兄,假如我們想要同時在localhost上訪問多個其他主機的變量呢,這就需要hostvars中的主機需要是一個變量晨继,舉個例子烟阐,我們想要比對從主機內(nèi)部查詢到的磁盤數(shù)量與從主機外部查詢到的磁盤數(shù)量是否相等。
- hosts: vnfA
tasks:
- name: check disk info iof vnfA inside of host
shell: |
echo {{ inventory_hostname }};
lsblk;
lsblk | grep -E -w "[s|v]d[a-z]" | wc -l;
args:
executable: /bin/bash
register: cmd
- debug: var=cmd.stdout_lines
- hosts: localhost
tasks:
- name: check disk info of vnfA foutside of host
shell: |
source {{ inventory_dir }}/openstack.creds;
vol_num_vim_in=`echo "{{ hostvars[item]['cmd'].stdout_lines[-1] }}"`;
echo $vol_num_vim_in;
server_id=`openstack {{ openstack_opts }} server list --all-projects| grep '{{ item }}' | awk -F'|' '{ print $2 }' | xargs`;
vol_num_vim=`openstack {{ openstack_opts }} server show $server_id | grep -E -o "\<id='[0-9|a-z|-]+'" | wc -l`;
echo $vol_num_vim;
[ "x$vol_num_vim" = "x$vol_num_vim_in" ] && echo "pass" || exit 1;
args:
executable: /bin/bash
register: o_cmd
with_items: "{{ groups['vnfA'] }}"
- debug: msg={{item.stdout_lines}}
with_items: "{{o_cmd.results}}"
上面的第一段代碼是檢查vnfA組中的所有主機上的磁盤數(shù)量(從主機內(nèi)部查詢紊扬,通過lsblk命令)蜒茄,我們在inventory.ini中可以定義vnfA組中具體有多少個主機。inventory.ini文件定義示例如下:
[vnfA]
CG_42_01 ansible_ssh_host=2000:194:99:42::13 ansible_ssh_user=root
CG_42_02 ansible_ssh_host=2000:194:99:42::14 ansible_ssh_user=root
CG_42_03 ansible_ssh_host=2000:194:99:42::15 ansible_ssh_user=root
CG_42_04 ansible_ssh_host=2000:194:99:42::16 ansible_ssh_user=root
上面的第二段代碼是在localhost上查詢vnf組中的所有主機(從主機外部查詢餐屎,通過openstack命令)檀葛,我們的目的是想要比對從主機內(nèi)部查詢到的磁盤數(shù)量與從主機內(nèi)部查詢到的磁盤數(shù)量相等,這時候就需要在localhost上去引用vnfA組中的所有主機內(nèi)部查詢到的磁盤數(shù)量腹缩,例如{{ hostvars['CG_42_01']['cmd'].stdout_lines }}屿聋,{{ hostvars['CG_42_02']['cmd'].stdout_lines }}空扎,{{ hostvars['CG_42_03']['cmd'].stdout_lines }},{{ hostvars['CG_42_04']['cmd'].stdout_lines }}润讥,如果單個去指定的話就顯得不太靈活转锈,我們通過with_items: "{{ groups['vnfA'] }}"定義要循環(huán)遍歷的主機組vnfA,通過{{ hostvars[item]['cmd'].stdout_lines[-1] }}這種方式來獲取vnfA組中的單個主機內(nèi)部查詢到的磁盤數(shù)量象对,其中item代表vnfA組中的單個主機黑忱。這樣就可以在localhost上對主機內(nèi)部查詢到的磁盤數(shù)量與主機外部查詢到的磁盤數(shù)量進(jìn)行對比了。
參考鏈接:https://stackoverflow.com/questions/40020087/using-a-variable-as-host-in-hostvars