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"
Да, это была просто опечатка, спасибо :)
Как и ожидалось, источник 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?
Поскольку вы будете передавать значение hosts в игру во время выполнения на основе переменных хоста, я бы предложил использовать ту же переменную для include_vars: редактирование моего ответа
На самом деле я использую --limit ansible2 для вывода более удобного и четкого вывода, но я пытаюсь добиться чего-то похожего на то, что у меня было с puppet/hiera , мне нужны значения по умолчанию из roles/vars (это работает), но я хочу получить, если мне нужны значения с уровня хоста (но я не хочу, чтобы они были на уровне CLI), чтобы подтвердить значения из ролей/имя роли/переменные
limit используется для выполнения задач на одном хосте из группы хостов, вы также можете использовать переменную hosts. Теперь, если одна и та же переменная объявлена в main.yml и ansible2.yml --> ansible2.yml будет иметь приоритет. Подобно факту в марионетке, у нас есть анзибл-факты, которые собирают информацию для каждого хоста и могут использоваться динамически.
Здравствуйте, я очень ценю помощь здесь. На самом деле это не работает, я сделал то, что вы написали: ОШИБКА! поле «hosts» является обязательным, но не было установлено. Я только что изменил masterplaybook, включив в него код: [ansible@ansible1 roles]$ cat /etc/ansible/roles/common.yml --- # Playbook для веб-серверов - hosts: " {{ hosts }}" - задачи: - include_vars: "{{ hosts }}" роли: - общие [роли ansible@ansible1]$
Также я определил имя хоста с содержимым: [роли ansible@ansible1]$ cat /etc/ansible/hosts_vars/ansible2 myvar: "myvar from host_vars" [роли ansible@ansible1]$
Я думаю, что нашел проблему, тире задачи. Теперь кажется, что 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/roles/ansible2\n\t/etc/ansible/roles/vars/ansible2\n\t/etc/ansible/roles/ansible2 на контроллере Ansible.\nЕсли вы используете модуль и
@Flechoide Похоже, вы не включили .yml в конце. include_vars: "{{ hosts }}.yml"
Да, это правда, но в файле также отсутствует расширение .yml: /etc/ansible/hosts_vars/ansible2
Можешь попробовать две вещи. 1 укажите аргумент пути к файлу include_vars, так как я не вижу каталог, в котором ansible пытается найти путь, по которому вы разместили файл..2. если вышеуказанное не работает, вы можете предоставить аргумент расширения и пути для модуля include_vars
Вот моя структура каталога: Базовый каталог 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
Также я попытался поместить каталог в 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
Привет, это сработало, когда я перешел с hosts_vars на host_var , моя ошибка опечатки, и я прокомментировал определение var из /etc/ansibleroles/common/vars/main.yml , поэтому проблема, похоже, заключается в том, что roles/module/vars/ main.yml имеет приоритет над hosts_Vars
Я могу подтвердить, что теперь изменение hosts_vars на host_var работает. Проблема заключается в том, что значение, определенное в /etc/ansible/host_vars/ansible2.yml, не имеет приоритета над значением, определенным в /etc/ansible/roles/common/vars/main.yml.
Да, ansible работает таким же образом, как и та же переменная, если она определена, приоритет будет соответствовать руководящим принципам ansible.
@Flechoide, что именно ты ищешь?
Я просто хотел добиться чего-то похожего на то, что у меня есть с марионеткой с иерархическими значениями, спасибо, вы мне очень помогли.
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, которые имеют более низкий приоритет.
Ansible 2.8.1:
hosts_vars
(множественное число) теперь отбрасывается как недопустимое. Работает толькоhost_vars
.