#ansible
Вопрос:
В моем учебнике у меня есть задачи, которые используют имя хоста сервера и экстраполируют данные, чтобы установить местоположение и среду на основе этого. Но некоторые серверы имеют уникальные имена, и я не знаю, как установить на них переменные. Я бы предпочел не использовать ансибельные факты, так как хотел бы поделиться учебником с командой. Один из способов, о котором я думал, — это сделать то, что указано ниже, но у меня возникли проблемы. Не мог бы кто-нибудь, пожалуйста, проводить меня.
Create vars_file inventory
---
customservers
customhostname1:
env: test
location: hawaii
customhostname2:
env: prod
location: alaska
In Playbook.
---
task
tasks:
- name: set hostname
shell: echo "customhostname1"
register: my_hostname
- name: setting env var
set_fact:
env: "{{ item.value.env }}"
when: my_hostname == "{{ item.key }}"
with_dict: "{{ customservers }}"
- name: outputing env var
debug:
msg: the output is {{ env }}
Expected output should be test.
Спасибо.
Комментарии:
1. Ответ в основном можно резюмировать следующим образом
"{{ hostvars['customhostname1'].env }}"
Ответ №1:
В моем учебнике у меня есть задачи, которые используют имя хоста сервера и экстраполируют данные, чтобы установить местоположение и среду на основе этого.
Плохая Идея.
Но некоторые серверы имеют уникальные имена, и я не уверен, как установить переменные на них
И вот почему.
Вторая плохая идея-иметь ТЕСТ и ПРОД в одном и том же инвентаре. Это просто напрашивается на катастрофу. Они должны быть двумя совершенно отдельными описями, хотя, возможно, в одном и том же родительском каталоге:
inventories/
inventories/test/
inventories/test/hosts
inventories/test/host_vars/
inventories/test/host_vars/customhostname1.yml
inventories/prod/
inventories/prod/hosts
inventories/prod/host_vars/
inventories/prod/host_vars/customhostname2.yml
Так inventories/prod/hosts
может выглядеть примерно так (я предпочитаю ini
формат):
[customservers]
customhostname2 location=hawaii
Или:
[customservers]
customhostname2
[customhostname2:vars]
location=hawaii
Но ни в коем случае НЕ объединяйте запасы тестов и продуктов.
Если вам все еще нужна эта env
переменная, вы можете либо поместить ее в group_vars/all.yml
файл, либо прямо в hosts
файл, например:
[all:vars]
env=prod
Комментарии:
1. Привет @Джек, Ты сделал действительно замечательные замечания и дал мне много поводов для размышлений. Я думаю, что подход к добавлению переменных в инвентарь является правильным для меня. Большое вам спасибо за отличную статью.