Проблемы с ansible 2.7.9 с использованием host_vars (неопределенная переменная)

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

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

[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]

Я определил мастер-плейбук под названием common, который вызывает common:

[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, она говорит, что переменная undefined :

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

Ansible 2.8.1: hosts_vars (множественное число) теперь отбрасывается как недопустимое. Работает только host_vars.

Teresa e Junior 02.07.2019 19:55

Да, это была просто опечатка, спасибо :)

Flechoide 03.07.2019 22:18
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
1
2
4 007
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

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

триггер -->

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

Спасибо за ответ, я понял, что вы говорите о суффиксе/расширении файла, я хотел бы спросить, какой файл будет наиболее правильным поставить include_vars?

Flechoide 05.04.2019 17:10

Поскольку вы будете передавать значение hosts в игру во время выполнения на основе переменных хоста, я бы предложил использовать ту же переменную для include_vars: редактирование моего ответа

error404 05.04.2019 17:15

На самом деле я использую --limit ansible2 для вывода более удобного и четкого вывода, но я пытаюсь добиться чего-то похожего на то, что у меня было с puppet/hiera , мне нужны значения по умолчанию из roles/vars (это работает), но я хочу получить, если мне нужны значения с уровня хоста (но я не хочу, чтобы они были на уровне CLI), чтобы подтвердить значения из ролей/имя роли/переменные

Flechoide 05.04.2019 17:20

limit используется для выполнения задач на одном хосте из группы хостов, вы также можете использовать переменную hosts. Теперь, если одна и та же переменная объявлена ​​в main.yml и ansible2.yml --> ansible2.yml будет иметь приоритет. Подобно факту в марионетке, у нас есть анзибл-факты, которые собирают информацию для каждого хоста и могут использоваться динамически.

error404 05.04.2019 17:42

Здравствуйте, я очень ценю помощь здесь. На самом деле это не работает, я сделал то, что вы написали: ОШИБКА! поле «hosts» является обязательным, но не было установлено. Я только что изменил masterplaybook, включив в него код: [ansible@ansible1 roles]$ cat /etc/ansible/roles/common.yml --- # Playbook для веб-серверов - hosts: " {{ hosts }}" - задачи: - include_vars: "{{ hosts }}" роли: - общие [роли ansible@ansible1]$

Flechoide 10.04.2019 14:39

Также я определил имя хоста с содержимым: [роли ansible@ansible1]$ cat /etc/ansible/hosts_vars/ansible2 myvar: "myvar from host_vars" [роли ansible@ansible1]$

Flechoide 10.04.2019 14:45

Я думаю, что нашел проблему, тире задачи. Теперь кажется, что ansible не может найти файл в host_vars : [ansible@ansible1 roles]$ ansible-playbook common.yml --extra-vars "hosts=ansible2" --limit ansible2 fatal: [ansible2]: FAILED! => {"ansible_facts": {}, "ansible_included_var_files": [], "changed": false, "message": "Не удалось найти или получить доступ к 'ansible2'\nИскал в:\n\t/etc/ansible/roles /vars/ansible2\n\t/etc/ansible/role‌s/ansible2\n\t/etc/a‌nsible/roles/vars/an‌​sible2\n\t/etc/ansib‌​le/roles/ansible2 на контроллере Ansible.\nЕсли вы используете модуль и

Flechoide 10.04.2019 14:49

@Flechoide Похоже, вы не включили .yml в конце. include_vars: "{{ hosts }}.yml"

error404 10.04.2019 15:44

Да, это правда, но в файле также отсутствует расширение .yml: /etc/ansible/hosts_vars/ansible2

Flechoide 10.04.2019 16:50

Можешь попробовать две вещи. 1 укажите аргумент пути к файлу include_vars, так как я не вижу каталог, в котором ansible пытается найти путь, по которому вы разместили файл..2. если вышеуказанное не работает, вы можете предоставить аргумент расширения и пути для модуля include_vars

error404 10.04.2019 17:25

Вот моя структура каталога: Базовый каталог ansible: [ansible@ansible1 ~]$ ls /etc/ansible/ ansible.cfg hosts hosts_vars roles Роли каталога base ansible: [ansible@ansible1 ~]$ ls /etc/ansible/roles/ common common.retry common.yml common.yml.20190410 Hosts_var под base ansible [ansible@ansible1 ~]$ ls /etc/ansible/hosts_vars/ ansible2 У меня есть мой cfg как этот, поэтому из документации говорится, что все относительно инвентаризации хоста файл: [ansible@ansible1 ~]$ cat /etc/ansible/ansible.cfg [значения по умолчанию] roles_path = /etc/ansible/roles inventory = /etc/ansible/hosts

Flechoide 11.04.2019 09:02

Также я попытался поместить каталог в yml, но он все еще не работает, однако теперь он не показывает никаких ошибок, просто использует значение переменной из /etc/ansible/roles/common//vars/main.yml вместо значения from /etc/ansible/hosts_vars/ansible2 : --- # Playbook для веб-серверов - hosts: "{{ hosts }}" tasks: - include_vars: "/etc/ansible/hosts_vars/{{ hosts }}" roles: - common

Flechoide 11.04.2019 09:08

Привет, это сработало, когда я перешел с hosts_vars на host_var , моя ошибка опечатки, и я прокомментировал определение var из /etc/ansibleroles/common/vars/main.yml , поэтому проблема, похоже, заключается в том, что roles/module/vars/ main.yml имеет приоритет над hosts_Vars

Flechoide 11.04.2019 11:24

Я могу подтвердить, что теперь изменение hosts_vars на host_var работает. Проблема заключается в том, что значение, определенное в /etc/ansible/host_vars/ansible2.yml, не имеет приоритета над значением, определенным в /etc/ansible/roles/common/vars/main.yml.

Flechoide 11.04.2019 11:29

Да, ansible работает таким же образом, как и та же переменная, если она определена, приоритет будет соответствовать руководящим принципам ansible.

error404 11.04.2019 12:24

@Flechoide, что именно ты ищешь?

error404 11.04.2019 13:56

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

Flechoide 12.04.2019 14:09
Ответ принят как подходящий

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

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)

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

Другие вопросы по теме