Я хочу перезаписать некоторые переменные в моем файле playbook из файла инвентаризации для хоста, которые определены как «vars_prompt». Если я правильно понимаю, Ansible не должен запрашивать переменные, если они уже были установлены ранее, однако он по-прежнему запрашивает переменные, когда я пытаюсь выполнить playbook.
Как я могу перезаписать переменные «vars_prompt» из инвентаря или это невозможно из-за определения приоритета переменных в Ansible?
Пример:
playbook.yml
---
- name: Install Gateway
hosts: all
become: yes
vars_prompt:
- name: "hostname"
prompt: "Hostname"
private: no
...
inventory.yml
---
all:
children:
gateways:
hosts:
gateway:
ansible_host: 192.168.1.10
ansible_user: user
hostname: "gateway-name"
...
Я не знаю, можете ли вы остановить подсказки, но вы можете увидеть значение по умолчанию непосредственно в vars_prompts. Таким образом, вам не нужно каждый раз вводить «имя-шлюза».
vars_prompt:
- name: "hostname"
prompt: "Hostname"
private: no
default: "gateway-name"
Источник: https://docs.ansible.com/ansible/latest/user_guide/playbooks_prompts.html
В: «Если я правильно понимаю, Ansible не должен запрашивать переменные, если они уже были установлены ранее, однако он по-прежнему запрашивает переменные, когда я пытаюсь выполнить плейбук».
А: Вы ошибаетесь. Ansible не будет запрашивать переменные, определенные в командной строке --extra-vars
. Цитата из Интерактивный ввод: подсказки:
Запросы для отдельных переменных vars_prompt будут пропущены для любой переменной, которая уже определена с помощью параметра командной строки --extra-vars, ...
Вы не можете перезаписать переменные vars_prompt из инвентаря. См. Понимание приоритета переменных. Переменные инвентаря (3.-9.) имеют более низкий приоритет по сравнению с воспроизведением vars_prompt (13.). Старшинство дополнительных переменных равно 22.
Используйте модуль pause, чтобы запросить имя хоста, если какая-либо переменная не определена. Например, инвентарь
shell> cat hosts
host_1
host_2
и сборник пьес
hosts: all
gather_facts: false
vars:
hostnames: "{{ ansible_play_hosts_all|
map('extract', hostvars, 'hostname')|
list }}"
hostnames_undef: "{{ hostnames|from_yaml|
select('eq', 'AnsibleUndefined')|
length > 0 }}"
tasks:
- debug:
msg: |
hostnames: {{ hostnames }}
hostnames_undef: {{ hostnames_undef }}
run_once: true
- pause:
prompt: "Hostname"
register: out
when: hostnames_undef
run_once: true
- set_fact:
hostname: "{{ out.user_input }}"
when: hostname is not defined
- debug:
var: hostname
дает
shell> ansible-playbook pb.yml
PLAY [all] ************************************************************************************
TASK [debug] **********************************************************************************
ok: [host_1] =>
msg: |-
hostnames: [AnsibleUndefined, AnsibleUndefined]
hostnames_undef: True
TASK [pause] **********************************************************************************
[pause]
Hostname:
gw.example.com^Mok: [host_1]
TASK [set_fact] *******************************************************************************
ok: [host_1]
ok: [host_2]
TASK [debug] **********************************************************************************
ok: [host_1] =>
hostname: gw.example.com
ok: [host_2] =>
hostname: gw.example.com
PLAY RECAP ************************************************************************************
host_1: ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
host_2: ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Playbook не перезапишет переменные, определенные в инвентаре. Например
shell> cat hosts
host_1
host_2 hostname=gw2.example.com
дает
TASK [debug] **********************************************************************************
ok: [host_1] =>
hostname: gw.example.com
ok: [host_2] =>
hostname: gw2.example.com
Ах хорошо. Спасибо, что указали мне на часть в документации. Поэтому я изменю свои файлы в соответствии с этим.
Я добавил пример, как запрашивать только отсутствующие переменные.
Это действительно приоритет. вы можете попробовать использовать модуль
set_fact
во время выполнения, чтобы снова перезаписать.