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

TL / DR: у меня есть переменные "src_host" и "dest_host", которые я хочу использовать для установки объекта "- hosts:" в игре. Тем не менее, я должен установить их снова для каждой игры в разделе «vars: of each» - hosts: », например. src_host = "{{hostvars ['localhost'] ['src_host']}}" как мне установить эти две переменные в начале и не нужно их сбрасывать?

Файл моего хоста выглядит так

[wordpress]
localhost ansible_user=user ansible_port=22 ansible_ssh_private_key_file=/home/user/.ssh/id_rsa
root_localhost ansible_user=root ansible_port=22 ansible_ssh_private_key_file=/home/user/.ssh/id_rsa

---snip---

server2.net ansible_host="server2.net" ansible_user=user ansible_port=22 ansible_ssh_private_key_file=/home/user/.ssh/id_rsa
root_server2.net ansible_host="server2.net" ansible_user=root ansible_port=22  ansible_ssh_private_key_file=/home/user/.ssh/id_rsa

Начало моей пьесы выглядит так:

- hosts: localhost, server2.net, root_server2.net #always include "localhost" in this list because it is needed to store the variables for the src_host and dest_host
  vars:
    src_host: localhost #modify these and the host will be changed for all subsequent plays/tasks
    dest_host: server2.net #modify these and the host will be changed for all subsequent plays/tasks
    src_dump_path: /home/user/cvrt9_dump.sql #set vars for copying file
  roles:  
    - set_facts_for_db_copy

- hosts: "{{ src_host }}" 
  vars: 
    src_host: "{{ hostvars['localhost']['src_host'] }}"
    dest_host: "{{ hostvars['localhost']['dest_host'] }}"
    ---snip---
  roles:
    - dump_db
    - copy_file

и т. Д. , .

для "- set_facts_for_db_copy" У меня есть "main.yml", как здесь, где я устанавливаю переменные "src_host" и "dest_host":

---
# tasks file for set_facts_for_db_copy
- name: create variables that equal src_dump_path and set src_host/dest_host
  set_fact:
    ---snip---
    src_host: "{{ src_host }}"
    dest_host: "{{ dest_host }}"

Так что мне нужно установить "src_host" и "dest_host" для всех последующих "- hosts:", которые используют их, получая значения из одной из переменных хоста, которые установлены "set_fact_for_db_copy". Я случайно выбрал «localhost», как вы могли заметить:

src_host: "{{ hostvars['localhost']['src_host'] }}"
dest_host: "{{ hostvars['localhost']['dest_host'] }}"

Если у меня нет этой строки, я получаю:

user@localhost:/home/maintainer/ansible-play$ ansible-playbook -i hosts_tat-kay playbook.yml 

PLAY [localhost, server2.net, root_server2.net] **************

TASK [setup] *******************************************************************
ok: [server2.net]
ok: [root_server2.net]
ok: [localhost]

TASK [set_facts_for_db_copy : create variables that equal src_dump_path] *******
ok: [localhost]
ok: [server2.net]
ok: [root_server2.net]
ERROR! the field 'hosts' has an invalid value, which appears to include a variable that is undefined. The error was: 'src_host' is undefined

The error appears to have been in '/home/maintainer/ansible-play/playbook.yml': line 14, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


- hosts: "{{ src_host }}" 
  ^ here

. , ,

Теперь я могу установить эти переменные в моем хост-файле:

[wordpress:vars]
src_host=localhost
dest_host=server2.net

Но тогда мне все равно придется ссылаться на них из последующих объектов "-hosts:" в моей пьесе с помощью "{{hostvars ['localhost'] ['src_host']}}" и т. Д. , , Поэтому мой вопрос заключается в том, как мне избавиться от этого избыточного кода во всех моих последующих объектах "-hosts:" (показано ниже), в то же время позволяя мне изменять переменные "src_host" и "dest_host" один раз в начале, и эти изменения влияют остальные пьесы? Спасибо.

    src_host: "{{ hostvars['localhost']['src_host'] }}"
    dest_host: "{{ hostvars['localhost']['dest_host'] }}"

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Одно решение, которое я нашел с помощью https://stackoverflow.com/users/4716639/bryan-calvo-benoit, заключается в том, чтобы поместить это в мой файл hosts (файл инвентаризации)

[wordpress] 
localhost 
server2.net 

[testenv:children] 
wordpress 

[testenv:vars] 
src_host=localhost 
dest_host=server2.net 

А потом в ансамбле пьесы и ролях, которые он называет, мне пришлось заменить

"{{ src_host }}" 

с

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

и аналогично для "{{dest_host}}"

Тем не менее, я мог бы удалить этот избыточный код в моей сборнике игр:

src_host: "{{ hostvars['localhost']['src_host'] }}"
dest_host: "{{ hostvars['localhost']['dest_host'] }}"

Было бы неплохо, если бы мне не приходилось менять src_host и dest_host на hostvars ['localhost'] ... потому что кажется произвольным использовать localhost, а также то, что если я хочу запустить несколько скриптов ansible сразу после другой с разными src_host и dest_host? Использование файла инвентаризации блокирует его, так что это не идеально. Если никто не ответит, я приму этот ответ, потому что он единственный, который работает, и технически делает то, что задал мой вопрос.

0 голосов
/ 02 октября 2018

Для этого используйте свой файл инвентаризации, создайте родительскую группу хоста, для которой вам нужна переменная, следующим образом.

[desireenv:children]
wordpress
otherhost
etc

и затем присваиваете значение vars новой созданной родительской группе

[desireenv:vars]
src_host: "{{ hostvars['localhost']['src_host'] }}"
dest_host: "{{ hostvars['localhost']['dest_host'] }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...