首页 > 解决方案 > 条件中定义的变量如何用作全局变量?

问题描述

我想取出所有符合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?~~

标签: ansibleansible-2.x

解决方案


你的问题有很多问题,但我们开始吧:

如何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,所以循环所有主机是在剧本中“广播”该信息的唯一方法


推荐阅读