Условные обозначения с пользовательскими переменными

#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. Привет @Джек, Ты сделал действительно замечательные замечания и дал мне много поводов для размышлений. Я думаю, что подход к добавлению переменных в инвентарь является правильным для меня. Большое вам спасибо за отличную статью.