如何将条件中定义的变量用作全局变量?

时间:2019-10-23 07:53:01

标签: ansible ansible-2.x

我想获取所有符合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_exists获取安装了docker的所有服务器ip,而没有安装docker的服务器?必须获得满足条件的ip值~~

~~或者还有其他方法可以获取满足when条件的所有ip吗?~~

1 个答案:

答案 0 :(得分:0)

您的问题中有很多问题,但是我们开始:

  

如何全局使用docker_ip变量?

没有“全局”之类的东西-所有变量都是“主机”变量

  

现在如何通过docker_exists获取安装了docker的所有服务器ip,而没有安装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吗?

通常,不,因为每个set_factregister:只是一个便捷的快捷方式)都是每个主机 ,因此遍历所有主机是唯一的“在剧本中广播”该信息