【发布时间】:2019-02-19 15:19:27
【问题描述】:
我想针对主机多次运行微服务角色以安装多个服务。我也想使用 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", sb_hosts:[ “我的测试虚拟机” ] }然后我想测试一个事实“当前主机在列表中吗?”。使用我特定的测试厨房 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 脚本来做一些如此基本的事情感觉很笨拙。有没有更简洁的方法来检查“这个变量列表中是变量标量”吗?
【问题讨论】:
-
您未能包含对您而言失败的实际 jinja2 sn-p,以便我们帮助您调试它。如果
{{ inventory_hostname in sb_hosts }}是假的,那么可能是{{ ansible_hostname in sb_hosts }}或{{ ansible_nodename ... }},或者包罗万象的{{ ([inventory_hostname, ansible_hostname, etcetc] | intersect(sb_hosts) | length) != 0 }} -
@MatthewLDaniel 非常感谢
inventory_hostname是本地主机,但ansible_hostname设置正确,因此有效的 j2 是sb_app_state="{% if ansible_hostname in sb_hosts %}present{% else %}absent{% endif %}"。如果您提供与您的评论相匹配的答案,即可以检查其他标准变量,那么我会接受它。
标签: ansible