我想对主机多次运行微服务角色以安装多个服务。我还想使用ansible来移动服务。这意味着我在all
主机上运行,并做了一些逻辑检查服务是否已安装以及是否应安装。
我发现检查服务是否已安装很容易。我在检查是否应安装该服务很麻烦。在我的剧本中,我定义了应该安装角色的主机列表:
roles: - { role: "ansible-role-springboot", sb_app_name: "microservices-registration", sb_app_group_id: "org.springframework.samples.service.service", sb_app_artifact_id: "microservices-demo", sb_app_version: "2.0.0.RELEASE", sb_hosts: [ "my-test-vm" ] }
然后我要测试一个事实“列表中的当前主机?”。使用我特定的测试厨房ansible设置,即使vm具有正确的主机名,stockstock_hostname也总是以localhost
的形式出现。因此,我想测试命令hostname -f
的输出在var list sb_hosts
中。这是我想出的:
- name: Transfer the script
copy: src=host_test.sh dest=/home/sbuser mode=0777
- name: Resolve hostname
command: "/home/sbuser/host_test.sh {{ sb_hosts }}"
register: hostname_output
- set_fact:
hostname_listed="{{ 'HOSTNAME_LISTED' in hostname_output.stdout}}"
host_test.sh
在哪里:
#!/bin/sh
HOSTNAME=$(hostname -f)
VARS=$1
if echo $VARS | grep $HOSTNAME; then
echo HOSTNAME_LISTED
else
echo HOSTNAME_NOT_LISTED
fi
复制shell脚本以执行某些操作,使基本感觉很笨拙。有没有更清洁的方法来检查“此变量列表中是否存在变量标量”?
答案 0 :(得分:1)
如果string::c_str()
为假,则可能为{{ inventory_hostname in sb_hosts }}
或{{ ansible_hostname in sb_hosts }}
,或者全部为{{ ansible_nodename ...etc... }}
您可以通过{{ ([inventory_hostname, ansible_hostname, etcetc] | intersect(sb_hosts) | length) != 0 }}
命令或转储setup
来查看ansible知道的名称的完整列表。
如果存在由- debug: var=hostvars
填充的可用hostvars
的目录,那么我不知道在哪里可以找到它。
答案 1 :(得分:0)
最后与:
ansible_hostname in sb_hosts