Введение
Когда одна и та же переменная определена в нескольких местах, Ansible применяет правила приоритетности. Отладка итогового значения критически важна перед внесением изменений в плейбук.
В этой лабораторной работе вы определите одни и те же переменные на уровнях all, group, host и extra-var, а затем создадите отчеты, которые наглядно покажут, какой уровень имеет наивысший приоритет.
Создание проекта для практики приоритетов
На этом этапе вы создадите проект с директориями для переменных уровней all, group и host.
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,inventory/host_vars,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
EOF
В этой лабораторной работе мы намеренно определяем одну и ту же переменную в нескольких местах. Отчеты покажут итоговое значение, выбранное Ansible, вместо того чтобы заставлять вас делать выводы о приоритетности только на основе имен файлов.
Определение переменных уровней All и Group
На этом этапе вы определите базовые значения в group_vars/all.yml, а затем переопределите их для группы web.
Перед выполнением команд на этом этапе вернитесь в директорию проекта Ansible. Это обеспечит стабильность выполнения команд, даже если LabEx запускает каждый шаг отдельно.
cd /home/labex/project/rhce-ansible
cat > inventory/group_vars/all.yml <<'EOF'
app_port: 8000
app_source: all
EOF
cat > inventory/group_vars/web.yml <<'EOF'
app_port: 8080
app_source: group
EOF
Файл group_vars/all.yml применяется ко всем хостам, в то время как group_vars/web.yml применяется только к группе web. Поскольку web1 и web2 являются веб-хостами, значения группы должны переопределять базовые значения для всех хостов.
cat inventory/group_vars/all.yml inventory/group_vars/web.yml
Определение переопределения переменной хоста
На этом этапе вы переопределите те же переменные только для web2. Переменные хоста имеют более высокий приоритет, чем переменные группы.
Перед выполнением команд на этом этапе вернитесь в директорию проекта Ansible.
cd /home/labex/project/rhce-ansible
cat > inventory/host_vars/web2.yml <<'EOF'
app_port: 9090
app_source: host
EOF
Этот файл применяется только к web2, поэтому он должен переопределить значения группы web для этого хоста. web1 по-прежнему должен использовать значения группы.
ansible-inventory --host web2
Используйте вывод инвентаря, чтобы подтвердить разрешенное значение перед запуском плейбука. Для web2 значение app_port должно быть 9090.
Вывод разрешенных значений переменных
На этом этапе вы напишете и запустите плейбук, который записывает итоговые значения, выбранные Ansible для каждого хоста. Перед выполнением команд на этом этапе вернитесь в директорию проекта Ansible.
cd /home/labex/project/rhce-ansible
cat > playbooks/show-precedence.yml <<'EOF'
---
- name: Show resolved variable precedence
hosts: web
gather_facts: false
tasks:
- name: Write resolved variable report
ansible.builtin.copy:
dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
content: |
host={{ inventory_hostname }}
app_port={{ app_port }}
app_source={{ app_source }}
mode: '0644'
EOF
Плейбук записывает итоговые разрешенные значения в файлы. Это делает приоритетность наглядной: каждый отчет фиксирует как выбранный порт, так и метку источника, которая указывает, какой уровень победил.
ansible-playbook playbooks/show-precedence.yml | tee reports/normal-run.txt
cat reports/web1.txt reports/web2.txt
Для web1 должно быть указано app_source=group, а для web2 — app_source=host. Это доказывает, что переменные хоста имеют более высокий приоритет, чем переменные группы.
Переопределение с помощью дополнительных переменных (Extra Variables)
На этом этапе вы передадите дополнительные переменные с помощью флага -e. Дополнительные переменные имеют очень высокий приоритет и переопределяют как переменные группы, так и переменные хоста для данного запуска.
Перед выполнением команд на этом этапе вернитесь в директорию проекта Ansible.
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/show-precedence.yml -e app_port=10080 -e app_source=extra | tee reports/extra-run.txt
Дополнительные переменные намеренно обладают высокой мощностью. Они переопределяют переменные группы и хоста для текущего запуска, но не изменяют файлы переменных на диске.
cat reports/web1.txt reports/web2.txt
Теперь в обоих отчетах должны отображаться значения дополнительных переменных. Если изменился только один хост, проверьте правильность ввода опций -e.
Резюме
Вы сравнили переменные уровней all, group, host и extra, а затем использовали созданные отчеты, чтобы доказать, какое значение Ansible применяет на каждом уровне приоритетности.


