Как переменные, определенные в условии, используются в качестве глобальных переменных? - PullRequest
0 голосов
/ 23 октября 2019

Я хочу получить значение ip всех серверов, которые соответствуют условию when.

Мой 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 глобально ??

~~ Теперь, как мне получить все ips сервера с установленным через docker docker_exists и сервером без докераустановлен? Необходимо получить значение ip, которое удовлетворяет условию ~~

~~ Или есть какой-либо другой способ получить все ips, которые удовлетворяют условию when? ~~

1 Ответ

0 голосов
/ 23 октября 2019

У вас есть много вопросов в вашем вопросе, но здесь мы идем:

как я могу использовать переменную docker_ip глобально ??

Естьнет такой вещи, как "глобально" - все переменные в ansible являются переменными "хоста"

Теперь, как мне получить все ips сервера с установленным докером через docker_exists,а сервер без установленного докера?

- 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)

Или есть какой-то другой способ получить все ips, которые удовлетворяют условию when?

В общем, нет, потому что каждый set_fact (который register: - просто удобный ярлык) на хост , так что циклирование по всем хостам - единственный способ "транслировать" эту информацию в книгу воспроизведения

...