Как динамически установить поле hosts в Ansible playbooks с переменной, сгенерированной во время выполнения? - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь что-то проверить дома с помощью механизма переменных Ansible предложений, которые я собираюсь реализовать в одном из моих проектов на работе. Итак, я долго искал, но, кажется, я не могу заставить его работать так легко, даже с решениями других тут и там.

Я буду представлять свои проекты logi c на работе сейчас, демонстрация с моей тестовой директорией и структурой файлов дома. Вот случай, у меня есть следующие пьесы:

main.yaml
pl1.yaml
pl2.yaml

Содержание ./main.yaml:

  - import_playbook: /home/martin/ansible/pl1.yaml
  - import_playbook: /home/martin/ansible/pl2.yaml

Содержание ./pl1.yaml:

- name: Test playbook 1
  hosts: localhost
  tasks:
  - name: Discovering the secret host
    shell: cat /home/martin/secret
    register: whichHostAd
  - debug:
      msg: "{{ whichHostAd.stdout }}"
  - name: Discovering my hostname
    shell: hostname
    register: myHostnameAd
  - set_fact:
      whichHost: "{{ whichHostAd.stdout }}"
      myHostname: "{{ myHostnameAd.stdout }}"
    cacheable: yes

- name: Test playbook 1 part 2
  hosts: "{{ hostvars['localhost']['ansible_facts']['whichHost'] }}"
  tasks:
  - name: Structuring info
    shell: hostname
    register: secretHostname
  - name: Showing the secret hostname
    debug:
      msg: "{{ secretHostname.stdout }}"

Содержание ./pl2.yaml:

- name: Test Playbook 2
  hosts: "{{ whichHost }}"
  tasks:
  - name: Finishing up
    shell: echo "And here am i again.." && hostname
  - name: Showing var myHostname
    debug:
      msg: "{{ myHostname.stdout }}"

Вся идея состоит в том, чтобы иметь рабочую переменную в go в поле hosts между играми. Как мы это сделаем?

Playbook вообще не запускается, если я не буду определять переменную whichHost в качестве дополнительного аргумента, и это нормально, я могу делать это каждый раз, но во время выполнения Я бы хотел, чтобы эта переменная была управляемой и изменяемой. В приведенном выше тестовом примере я хочу, чтобы whichHost использовался повсюду в play / playbooks, включенных в main.yaml, в частности, чтобы отразить вывод первой задачи в pl1.yaml (или вывод whichHostAd.stdout переменная), поэтому я могу определить хост, на который я нацеливаюсь в pl2.yaml.

В соответствии с документами, я должен иметь по крайней мере доступ к нему с помощью hostvars (как в моей пьесе), но это вывод, который я получаю, когда я пробую приведенный выше пример:

ERROR! The field 'hosts' has an invalid value, which includes an undefined variable. The error was: 'dict object' has no attribute 'whichHost'

The error appears to have been in '/home/martin/ansible/pl1.yaml': line 22, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


- name: Test playbook 1 part 2
  ^ here

set_fact также не кажется очень полезным. Любая помощь будет оценена!

1 Ответ

1 голос
/ 02 февраля 2020

Хорошо, я на самом деле понял это довольно быстро.

Итак, нам определенно нужно иметь задачу по факту, содержащую фактические данные / вывод:

- hosts: localhost
  tasks:
  - name: Saving variable
    set_fact:
      whichHost: "{{ whichHostAd.stdout }}"

После этого , когда вы хотите вызвать var в других хостах и ​​играх, мы должны предоставить хост и факт:

"{{ hostvars['localhost']['whichHost'] }}"

Как в моем тесте выше, но без ['ansible_facts']

...