Рейтинг:1

выбранные хосты в инвентаре на основе подмножества имен в недоступном

флаг dz

Я довольно новичок в ansible, поэтому, возможно, это легко сделать.

У нас есть большое количество устройств, которые имеют согласованное соглашение об именах в разных средах.

app0[01:25].dev.domain.com
приложение[01:25].qa.domain.com
приложение[01:25].uat.domain.com
приложение[01:25].prod.domain.com

Различные устройства внутри этих серверов приложений имеют определенные роли, такие как веб-сервер, сервер приложений, сервер API и т. д., и они одинаковы во всех средах. Итак, app05 — это веб-сервер в dev, qa, uat, uat, prod.

Прямо сейчас я использую group_vars и назначаю определенные роли сервера именам групп. Но я бы предпочел не настраивать имена групп для каждой среды (webdev, webqa, webuat и т. д.).

Есть ли простое решение для этого? Я думаю, что роли немного усложнили бы ситуацию, но, может быть, это и есть решение?

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

Вопрос: "Настройте имена групп для каждой среды (webdev, webqa, webuat и т. д.)."

A: Создайте переменную динамически, например.

- хозяева: все
  сбор_фактов: ложь
  вары:
    среда:
      приложение05: Интернет
  задачи:
    - set_fact:
        env_local: "{{ env[_host]|d('none') }}{{ _group }}"
      вары:
        _arr: "{{ inventory_hostname.split('.') }}"
        _host: "{{ _arr.0 }}"
        _group: "{{ _arr.1 }}"
    - отладка:
        переменная: env_local

дает

хорошо: [app01.dev.domain.com] => 
  env_local: нет разработчиков
хорошо: [app02.dev.domain.com] => 
  env_local: нет разработчиков
хорошо: [app03.dev.domain.com] => 
  env_local: нет разработчиков
хорошо: [app04.dev.domain.com] => 
  env_local: нет разработчиков
хорошо: [app05.dev.domain.com] => 
  env_local: веб-разработчик

Используйте модуль add_host и создавать группы динамически. Например, создайте файл

оболочка> кошка add_host_to_groups.yml
- добавить_хост:
    имя: "{{ я }}"
    группы: "{{ item }}{{ (i.split('.')).1 }}"
  цикл: "{{ _hosts }}"
  loop_control:
    loop_var: я

и включить его в цикл правил присваивания

- хозяева: все
  сбор_фактов: ложь
  вары:
    среда:
      веб: app05
  задачи:
    - include_tasks: add_host_to_groups.yml
      цикл: "{{env.keys()|список}}"
      вары:
        _hosts: "{{ ansible_play_hosts_all|select('match', env[item] ~ '.*') }}"
      run_once: правда
    - отладка:
        переменная: группы
      run_once: правда

дает

  группы:
    все:
    - app01.dev.domain.com
    - app02.dev.domain.com
    - app03.dev.domain.com
      ...
    - app25.prod.domain.com
    веб-разработчик:
    - app05.dev.domain.com
    веб-продукт:
    - app05.prod.domain.com
    вебка:
    - app05.qa.domain.com
    Вебуат:
    - app05.uat.domain.com

Используйте группы в последовательных играх, например.

- хосты: webqa
  сбор_фактов: ложь
  задачи:
    - отладка:
        переменная: ansible_play_hosts_all

дает

  ansible_play_hosts_all:
  - app05.qa.domain.com

Подходит к словарю окружение к вашим потребностям.

flyerhawk avatar
флаг dz
ХОРОШО. Нужно немного обработать это, но это выглядит потрясающе. Я вернусь, как только выясню, что вы предлагаете здесь. РЖУ НЕ МОГУ.
Рейтинг:0
флаг cn

Схема инвентаризации, которая устанавливает источник истины, будет заключаться в запросе этих групп из некоторой системы. Что-то более сложное, чем строки в имени DNS.

Например, система базы данных инвентаризации netbox имеет подходящую роль устройства. Не придираться к netbox, но у него есть плагин инвентаризации Ansible и открытая модель базы данных, поэтому о ней легко говорить.


Однако, возможно, хорошей внешней базы данных еще не существует. Такая обычная схема именования может быть сгенерирована. С этим самым рекурсивным плагином инвентаризации Ansible генератор:

#инвентарь.yml
плагин: генератор
хосты:
    name: "{{ application }}{{ number }}.{{ environment }}.example.com"
    родители:
      - имя: "{{ приложение }}_{{среда }}"
        родители:
          - имя: "{{ приложение }}"
            вары:
              приложение: "{{ приложение }}"
          - имя: "{{среда }}"
            вары:
              среда: "{{ среда }}"
слои:
    применение:
        - приложение
        - апи
    среда:
        - разработчик
        - ка
        - уат
        - прод
    количество:
        - "01"
        - "02"
        - "05"

Имена слоев произвольны.Учитывая корень «hosts» и нотацию «parents», имена с более глубоким отступом представляют собой группы, содержащие внешние имена.

ansible-inventory -i inventory.yml --list будет печатать хосты в JSON-документе инвентаризации Ansible. Частичный вывод:

{
    "_мета": {
        "хостварс": {

           "app05.qa.example.com": {
                "приложение": "приложение",
                "окружающая среда": "ка"
            }
        }
    },

    "приложение_qa": {
        "хозяева": [
            "app01.qa.example.com",
            "app02.qa.example.com",
            "app05.qa.example.com"
        ]
    },

    "приложение": {
        "дети": [
            "приложение_dev",
            "приложение_продукт",
            "приложение_ка",
            "приложение_уат"
        ]
    },

    "ка": {
        "дети": [
            "апи_ка",
            "приложение_ка"
        ]
    },


}

И продолжаем для других комбинаций.

Обратите внимание, что это сделано:

  • группы приложений
  • группы "окружающая среда"
  • группы комбинаций "среда приложения"
  • имена хостов, соответствующие шаблону имен DNS
  • vars, содержащие «приложение» и «среду» для каждого хоста

Ограничения этого плагина включают:

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

Отсутствие компактных диапазонов хостов. Ни синтаксис [01:25], ни функция range() не работают. Подумайте о том, чтобы запросить это, заполнив вопрос. В качестве обходного пути можно использовать десятки чисел в файле конфигурации.

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

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