Не могу получить доступ к свойству ansible_host моих предметов инвентаря - PullRequest
1 голос
/ 28 мая 2020

У меня есть этот файл инвентаризации:

[masters]
master ansible_host=1.2.3.4.5 ansible_user=ubuntu

[workers]
worker1 ansible_host=1.2.3.4.5 ansible_user=ubuntu

[nodes]
master ansible_host=1.2.3.4.5 ansible_user=ubuntu
worker1 ansible_host=1.2.3.4.5 ansible_user=ubuntu

[fileserver]
fs-01 ansible_host=1.2.3.4.5 ansible_user=ubuntu

Я пытаюсь установить ключ S SH с моей локальной машины на все машины инвентаризации.

- name: install the SSH key on all machines.
  hosts: 127.0.0.1
  connection: local
  tasks:
  - name: install SSH-key 
    shell: sshpass -p {{ ssh_key_password }} ssh-copy-id -i /id_rsa.pub -o StrictHostKeyChecking ubuntu@{{ item }}
    with_items:
      - "{{ hostvars['all'].ansible_host }}"

Однако это заканчивается этой ошибкой:

fatal: [127.0.0.1]: FAILED! => {"msg": "\"hostvars['all']\" is undefined"}

Я пытаюсь получить ansible_host 1.2.3.4.5 каждого уникального имени инвентаря в моем инвентаре. Однако мне не очень везет. Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Вы идете задом наперед. Ansible автоматически проходит через ваши игровые хосты, поэтому используйте ваши хосты, а не localhost, а затем делегируйте задачу localhost.

- name: install the SSH key on all machines.
  hosts: all
  gather_facts: no
  tasks:
  - name: install SSH-key 
    shell: sshpass -p {{ ssh_key_password }} ssh-copy-id -i /id_rsa.pub -o StrictHostKeyChecking {{ ansible_user }}@{{ ansible_host }}
    delegate_to: localhost
0 голосов
/ 29 мая 2020

Я думаю, что ссылка, которую вы ищете, выглядит как показано ниже

---
- hosts: localhost
  connection: local
  gather_facts: no
  tasks:
  - name: Print all hosts
    debug:
     msg: "{{hostvars[item]['ansible_host']}}"
    with_items:
    - "{{groups['all']}}"

Это дает результат

PLAY [localhost] ***************************************************************************************************************************************************************************************************************************************************************

TASK [Print all hosts] *******************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=master) => {
    "msg": "1.2.3.4.5"
}
ok: [localhost] => (item=worker1) => {
    "msg": "1.2.3.4.5"
}
ok: [localhost] => (item=fs-01) => {
    "msg": "1.2.3.4.5"
}

PLAY RECAP *********************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

0 голосов
/ 28 мая 2020

hostvars - это словарь, в котором ansible хосты хранятся как ключи, а их переменные - как значения. поэтому для вашего инвентаря hostvars dict будет выглядеть так:

master: {...}
worker1: {...}
fs-01: {...}

Причина, по которой all возвращает undefined, заключается в том, что у вас нет хоста с именем all.

Поскольку вам просто нужно имя хоста, вместо hostvars['all'].ansible_host, просто используйте ansible_host, который разрешит имя хоста для вас в s sh в.

Вот так:

    with_items:
      - "{{ ansible_host }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...