首页 > 解决方案 > 如何检查当前主机出现在ansible内的变量列表中?

问题描述

我想针对主机多次运行微服务角色以安装多个服务。我也想使用 ansible 来移动服务。这意味着我对all我的主机运行并执行一些逻辑来检查是否安装了服务以及是否应该安装它。

我发现很容易检查该服务是否已安装。我正在检查是否应该安装该服务是笨重的。在我的剧本中,我定义了一个应该安装角色的主机列表:

角色:
    - {
      角色:“ansible-role-springboot”,
      sb_app_name: "微服务注册",
      sb_app_group_id: "org.springframework.samples.service.service",
      sb_app_artifact_id:“微服务演示”,
      sb_app_version: "2.0.0.RELEASE",
      某人主机:[
        “我的测试虚拟机”
      ]
    }

然后我想测试一个事实“当前主机在列表中吗?”。使用我特定的测试厨房 ansible 设置,inventory_hostname 总是会出现,localhost即使 vm 具有正确的主机名。所以我想测试命令的输出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 脚本来做一些如此基本的事情感觉非常笨拙。是否有一种更简洁的方法来检查“此变量列表中是否为变量标量”?

标签: ansible

解决方案


如果{{ inventory_hostname in sb_hosts }}是假的,那么也许{{ ansible_hostname in sb_hosts }}or {{ ansible_nodename ...etc... }},或者包罗万象{{ ([inventory_hostname, ansible_hostname, etcetc] | intersect(sb_hosts) | length) != 0 }}

您可以通过命令获取 ansible 知道的名称的完整列表setup,或者通过转储- debug: var=hostvars查看其中隐藏了哪些有趣的玩具。

如果有可用hostvars的由 填充的目录setup,那么我不知道在哪里可以找到它。


推荐阅读