Ansible 如何将条件中定义的变量用作全局变量?
我想在条件下取出与Ansible 如何将条件中定义的变量用作全局变量?,ansible,ansible-2.x,Ansible,Ansible 2.x,我想在条件下取出与匹配的所有服务器的ip值 我的ansible剧本如下: - 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}}" regist
匹配的所有服务器的ip值
我的ansible剧本
如下:
- 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\u ip
变量不是全局变量,但仅在满足docker\u中“docker version 18.09.6”条件的机器上。在不满足此条件的机器上,stdout“
。直接错误,提示任务包含一个带有未定义变量的选项。错误是:“dict object”没有属性“stdout”,如何全局使用docker\u ip
变量
~~现在我如何通过docker\u exists
获取安装了docker的所有服务器IP,以及未安装docker的服务器?必须获得满足条件的ip值~~
~~或者有没有其他方法可以在条件下获得满足条件的所有IP?~~您的问题中有很多问题,但现在我们开始: 如何全局使用
docker\u ip
变量
没有“全局”这样的东西--ansible中的所有变量都是“主机”变量
现在,如何通过docker\u exists
获取安装了docker的所有服务器IP,以及未安装docker的服务器
如果您的字面意思是IP,而不是inventory\u主机名
,那么将results.append(hn)
更改为results.append(hostvars[hn].ansible\u default\u ipv4.address)
或者是否有其他方法可以获得满足when条件的所有IP
一般来说,没有,因为每个集合\u fact
(注册:只是一个方便的快捷方式)都是每个主机,所以在所有主机上循环是在剧本中“广播”该信息的唯一方式
- 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 }}