Вопрос: "Как переопределить переменную playbook, если она установлена в host_vars в Ansible?"
А: Взгляните на Переменный приоритет. Приоритет играть в варс равно 12. Есть еще 10 способов переопределить играть в варс, но ни один из них не позволит вам выборочно переопределить переменную для одного хоста.
Вам придется удалить декларацию ansible_connection: aws_ssm
из playbook, если вы хотите изменить его для одного хоста. Лучшее место для группа декларация о соединении есть group_vars (приоритет 3-7) и лучшее место для переопределения group_vars для одного хоста host_vars (приоритет 8-10). Например
оболочка> кошачьи хосты
[aws1]
server1 ansible_connection=local # приоритет 8.
сервер2
сервер3
[aws1: варс]
ansible_connection=aws_ssm # приоритет 3.
Существует множество комбинаций host_vars и group_vars для достижения этого сценария. Но если вы установите переменную в играть в варс (приоритет 12) вы больше не можете переопределить его для одного хоста.
Динамическая переменная
Переменную можно объявить динамически. Например
ansible_connection: "{{ 'локальный'
если inventory_hostname == 'server1'
еще
'aws_ssm' }}"
Это будет работать на любом уровне приоритета. Но из-за ленивой оценки это очень неэффективно. Переменная будет оцениваться каждый раз, когда на нее ссылаются.
«Экземпляр» динамической переменной
Если вам действительно нужно использовать динамическую переменную, создайте ее экземпляр, чтобы избежать повторной оценки. Что это означает? Например, учитывая инвентарь (в YAML для лучшей читабельности)
оболочка> кошачьи хосты
все:
хосты:
сервер1:
ansible_host: локальный хост
ansible_python_interpreter: /usr/bin/python3.8
сервер2:
доступный_хост: 10.1.0.62
ansible_user: администратор
ansible_python_interpreter: /usr/local/bin/python3.8
сервер3:
доступный_хост: 10.1.0.63
ansible_user: администратор
ansible_python_interpreter: /usr/local/bin/python3.8
дети:
серверы:
хосты:
сервер1:
сервер2:
сервер3:
Плейбук
- хосты: серверы
вары:
ansible_connection: "{{ 'локальный'
если inventory_hostname == 'server1'
еще
'шш' }}"
задачи:
- отладка:
сообщение: "{{ ansible_play_hosts|
map('extract', hostvars, 'ansible_connection') }}"
run_once: правда
- отладка:
переменная: ansible_connection
дает
ИГРАТЬ [серверы] **************************************************** *******
ЗАДАНИЕ [Сбор фактов] ***************************************************
хорошо: [сервер1]
хорошо: [сервер2]
хорошо: [сервер3]
ЗАДАЧА [отладка] **************************************************** *********
хорошо: [сервер1] =>
msg: '[AnsibleUndefined, AnsibleUndefined, AnsibleUndefined]'
ЗАДАЧА [отладка] **************************************************** *********
хорошо: [сервер1] =>
ansible_connection: локальный
хорошо: [сервер2] =>
ansible_connection: ssh
хорошо: [сервер3] =>
ansible_connection: ssh
Соединения работают как положено, но переменная ansible_connection не входит в хоствары. Используйте модуль set_fact и «создайте экземпляр» переменной, например.
- set_fact:
ansible_connection: "{{ ansible_connection }}"
- отладка:
сообщение: "{{ ansible_play_hosts|
map('extract', hostvars, 'ansible_connection') }}"
run_once: правда
дает
ЗАДАЧА [set_fact] **************************************************** ******
хорошо: [сервер1]
хорошо: [сервер2]
хорошо: [сервер3]
ЗАДАЧА [отладка] **************************************************** *********
хорошо: [сервер1] =>
сообщение:
- местный
- сш
- сш