ansible - 如何检查当前主机出现在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 脚本来做一些如此基本的事情感觉非常笨拙。是否有一种更简洁的方法来检查“此变量列表中是否为变量标量”?
解决方案
如果{{ 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
,那么我不知道在哪里可以找到它。
推荐阅读
- java - Java 泛型:从泛型对象中检索类型
- testing - JMeter - 随着时间的推移活跃的威胁
- rabbitmq - ubuntu 18.04 中的 Rabbitmq-server 安装错误
- flutter - 关闭键盘时,PageView 不会向下滚动
- asp.net-mvc - IIs 重写规则仅适用于 localhost
- python - 无法在浏览器上使用 Docker compose 运行 Django 应用程序
- nginx - 如何更改 Kubernetes 维护的 nginx 入口中的默认 TCP 服务 proxy_timeout?
- windows - Windows 上的 Git 结帐后挂钩
- android - 联系人:我如何知道我是否可以将联系人转移到的帐户?
- swift - 将框架添加到 Xcode 项目时,Gitlab 阶段包含对丢失文件的引用