ansible - 条件中定义的变量如何用作全局变量?
问题描述
我想取出所有符合when
条件的服务器的ip值。
我ansible-playbook
的如下:
- name: Get all the servers with docker installed
shell: docker -v
failed_when: False
register: docker_exists
- name: Get the server where docker is installed
shell: echo "{{inventory_hostname}}"
register: docker_ip
when: "'Docker version 18.09.6' in docker_exists.stdout"
经测试,该docker_ip
变量不是全局变量,只能在满足条件的"Docker version 18.09.6' in docker_exists.stdout"
机器上,在不满足条件的机器上。直接报错,提示The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'stdout'
,怎么docker_ip
全局使用变量??
~~现在我如何获得所有安装了docker的服务器ip docker_exists
,以及没有安装docker的服务器?必须获取满足条件的ip值~~
~~或者有没有其他方法可以获取所有满足when
条件的ip?~~
解决方案
你的问题有很多问题,但我们开始吧:
如何
docker_ip
全局使用变量?
没有“全局”这样的东西——ansible中的所有变量都是“主机”变量
现在如何通过 docker 获取所有安装了 docker 的服务器 ip
docker_exists
,以及没有安装 docker 的服务器?
- name: declare discovered docker hosts
set_fact:
hosts_with_docker: >-
{%- set results = [] -%}
{%- for hn in groups["all"] -%}
{%- if "Docker version" in hostvars[hn].get("docker_exists", {"stdout": ""}).stdout -%}
{%- set _ = results.append(hn) -%}
{%- endif -%}
{%- endfor -%}
{{ results }}
如果您的字面意思是 IP,而不是inventory_hostname
,则更results.append(hn)
改为results.append(hostvars[hn].ansible_default_ipv4.address)
或者有没有其他方法可以获得满足when条件的所有ip?
一般来说,不,因为 each set_fact
(这register:
只是一个方便的快捷方式)是per host,所以循环所有主机是在剧本中“广播”该信息的唯一方法
推荐阅读
- deep-learning - 使用从磁盘加载的 CNN 模型进行预测后出错
- asp.net-core - JWT 令牌在 asp.net core 3.1 中强制过期
- ionic-framework - Ionic React:如何集成自定义字体和图标集
- amazon-web-services - Amazon Cognito 用户池 - 使用“用户名”属性存储自定义用户 ID
- excel - 具有表头过滤值的单元格验证列表
- email - (中间值).sendEmail(...).promise 不是函数
- flutter - 如何在 Wrap Widget 中换行
- javascript - 如何使用 React Router Dom 在 ReactJS 上正确路由页面
- c# - 使用带有 .AddClientAccessTokenHandler() 扩展名的 HttpClient 时,不包括角色声明
- configuration - Ansible Inventory 多行库存数组?