我们知道ansible中的hostvars变量可以访问其他主机的变量,例如我目前在localhost上,我想访问controller1主机上的cmd变量的输出值,可以使用{{ hostvars['controller1']['cmd'].stdout_lines }},现在有一种新需求,假如我们想要同时在localhost上访问多个其他主机的变量呢,这就需要hostvars中的主机需要是一个变量,举个例子,我们想要比对从主机内部查询到的磁盘数量与从主机外部查询到的磁盘数量是否相等。
- 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组中的所有主机上的磁盘数量(从主机内部查询,通过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命令),我们的目的是想要比对从主机内部查询到的磁盘数量与从主机内部查询到的磁盘数量相等,这时候就需要在localhost上去引用vnfA组中的所有主机内部查询到的磁盘数量,例如{{ 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'] }}"定义要循环遍历的主机组vnfA,通过{{ hostvars[item]['cmd'].stdout_lines[-1] }}这种方式来获取vnfA组中的单个主机内部查询到的磁盘数量,其中item代表vnfA组中的单个主机。这样就可以在localhost上对主机内部查询到的磁盘数量与主机外部查询到的磁盘数量进行对比了。
参考链接:https://stackoverflow.com/questions/40020087/using-a-variable-as-host-in-hostvars