如何检查当前主机是否在ansible的变量列表中?

时间:2019-02-19 15:19:28

标签: ansible

我想对主机多次运行微服务角色以安装多个服务。我还想使用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脚本以执行某些操作,使基本感觉很笨拙。有没有更清洁的方法来检查“此变量列表中是否存在变量标量”?

2 个答案:

答案 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