Рейтинг:5

Как я могу переопределить переменную playbook, если она установлена ​​​​в host_vars в Ansible?

флаг us

server1 находится в группе it_servers, но я хотел бы использовать ansible_connection: локальный. Как это можно сделать, если ansible_connection определяется в playbook и host_vars?

--
- хосты: it_servers
  вары:
    ansible_connection: aws_ssm
  роли:
    - нгинкс
    - mysql

Мой host_vars/server1.yml файл

ansible_connection: локальный
Рейтинг:6
флаг br

Вопрос: "Как переопределить переменную 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] => 
  сообщение:
  - местный
  - сш
  - сш
Рейтинг:0
флаг in
Max

Ansible применяет приоритет переменных, и он может вам пригодиться. Вот порядок старшинства от наименьшего к наибольшему (переменные, перечисленные последними, переопределяют все остальные переменные):

значения командной строки (например, -u my_user, это не переменные)

значения по умолчанию для ролей (определены в role/defaults/main.yml) 1

файл инвентаризации или группа сценариев vars 2

инвентарь group_vars/все 3

playbook group_vars/все 3

инвентаризация group_vars/* 3

playbook group_vars/* 3

файл инвентаризации или скрипт host vars 2

инвентарь host_vars/* 3

плейбук host_vars/* 3

факты хоста / кэшированные set_facts 4

играть в варс

играть в vars_prompt

играть в vars_files

ролевые переменные (определены в role/vars/main.yml)

block vars (только для задач в блоке)

переменные задачи (только для задачи)

include_vars

set_facts / зарегистрированные переменные

параметры роли (и include_role)

включить параметры

дополнительные переменные (например, -e "user=my_user") (всегда имеют приоритет)

Это лучше объяснить здесь: https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable

Рейтинг:0
флаг in

Ты можешь использовать делегат_к: локальный хост для задачи.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.