Проблемы с ansible 2.7.9 с использованием host_vars (неопределенная переменная) - PullRequest
1 голос
/ 05 апреля 2019

Ansible 2.7.9 не использует host_vars

Я настроил очень простую установку с 3 хостами, в основном для тестирования. У меня есть хозяева:

- ansible1 (this is where I store the code)
- ansible2
- ansible3

Мой инвентарь:

[ansible@ansible1 ~]$ cat /etc/ansible/hosts
[common]
ansible1
ansible2
ansible3

Мой CFG выглядит так:

[ansible@ansible1 ~]$ cat /etc/ansible/ansible.cfg
[defaults]
roles_path = /etc/ansible/roles
inventory  = /etc/ansible/hosts
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
pipelining = True
control_path = /tmp/ansible-ssh-%%h-%%p-%%r
pipelining = False
[accelerate]
[selinux]
[colors]

Я определил основную пьесу, называемую общей, которая называет общей:

[ansible@ansible1 ~]$ ls /etc/ansible/roles/
common  common.retry  common.yml
[ansible@ansible1 ~]$ cat /etc/ansible/roles/common.yml
--- # Playbook for webservers
- hosts: common
  roles:
    - common
[ansible@ansible1 ~]$

Задача / main.yml:

[ansible@ansible1 ~]$ cat /etc/ansible/roles/common/tasks/main.yml
- name: test ansible1
  lineinfile:
    dest: /tmp/ansible.txt
    create: yes
    line: "{{ myvar }}"
- name: set ansible2
  lineinfile:
    dest: /tmp/ansible2.txt
    create: yes
    line: "hi"
[ansible@ansible1 ~]$

[ansible@ansible1 ~]$ cat /etc/ansible/roles/common/vars/main.yml
copyright_msg: "Copyrighta 2019"
myvar: "value of myvar from common/vars"

Затем я разместил некоторую информацию в / etc / ansible / host_vars

[ansible@ansible1 ~]$ ls /etc/ansible/hosts_vars/
ansible2.yml
[ansible@ansible1 ~]$ cat /etc/ansible/hosts_vars/ansible2.yml
myvar: "myvar from host_vars"
[ansible@ansible1 ~]$

Отлично работает с playbook:

[ansible@ansible1 ~]$ ansible-playbook /etc/ansible/roles/common.yml --limit ansible2

PLAY [common] ******************************************************************

TASK [Gathering Facts] *********************************************************
ok: [ansible2]

TASK [common : test ansible1] **************************************************
changed: [ansible2]

TASK [common : set ansible2] ***************************************************
changed: [ansible2]

PLAY RECAP *********************************************************************
ansible2                   : ok=3    changed=2    unreachable=0    failed=0

Я вижу файл с содержанием myvar:

[root@ansible2 ~]# cat /tmp/ansible.txt
value of myvar from common/vars
[root@ansible2 ~]#

Но тогда я не понимаю, почему он не принимает значение из /etc/ansible/hosts_vars/ansible2.yml, фактически, если я прокомментирую строку из /etc/ansible/roles/common/vars/main.yml говорит неопределенную переменную:

[ansible@ansible1 ansible]$ cat /etc/ansible/roles/common/vars/main.yml
copyright_msg: "Copyrighta 2019"
myvar: "value of myvar from common/vars"

Ответы [ 2 ]

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

Ansible использует этот приоритет для значений из переменных:

From least to most important
role defaults
inventory file or script group vars
inventory group_vars/all
playbook group_vars/all
inventory group_vars/*
playbook group_vars/*
inventory file or script host vars
inventory host_vars/*
playbook host_vars/*
host facts
play vars
play vars_prompt
play vars_files
role vars (defined in role/vars/main.yml)
block vars (only for tasks in block)
task vars (only for the task)
role (and include_role) params
include params
include_vars
set_facts / registered vars
extra vars (always win precedence)

Так что лучше забыть об использовании ролей / переменных, поскольку он имеет приоритет над host_vars, поэтому я должен использовать вместо ролей / значений по умолчанию, который имеетболее низкий приоритет.

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

Как и ожидалось, main.yml будет получен автоматически при выполнении playbook. рассматривать этот файл как глобальные переменные.

Причина, по которой ansible2.yml не получен, заключается в том, что ansible ожидает, что вы получите этот источник явно во время выполнения.

Вы можете использовать код ниже (общий).

---
- name: play
  hosts: "{{ hosts }}"
  tasks:
    - include_vars: "{{ hosts }}.yml"

триггер ->

ansible-playbook -i inventory --extra-vars "hosts=ansible2"
...