amarao (amarao_san) wrote,
amarao
amarao_san

Category:

ansible best practice

Все группы должны делиться на три категории:

* Группы, которые используются для назначения tasks (т.е. группы, в отношении которых выполнятся действия).
* Группы, которые используются для хранения общих переменных
* Группы, которые используются для итерации по ним с целью сбора данных или вычисления чего-то.

Путать эти группы нельзя, если назначить таску на группу, которая используется для хранения переменных, то теряется свобода включения в эту группу любого хоста, которому нужен доступ к этим переменным. Яркий пример, мониторинг, которому надо шариться по чужим параметрам (номера портов и прочие настройки), но которому точно не надо ничего "настраивать", связанное с этими портами.

Аналогично же с группами для query. Тому же мониторингу может нужно пошуршать по группе и собрать какую-то информацию, но эта группа может сильно отличаться от исполнения кода.

Чаще всего структура такая:
группа_с_переменными:
  children:
     группа_для_исполнения (читает и настраивает)
     группа_без_исполнения (просто читает)
     ...


Важно помнить, какая группа для чего, чтобы потом не обнаруживать, что "мы не можем включить foo в группу bar, потому что если мы настроим bar на foo, всё сломается, но foo надо знать число членов пула в bar, давайте будем шариться по чужим переменным через hostvars[group['bar'][0]]". Вот чтобы без таких изворотов делать, надо делать так, чтобы в нужный момент эти переменные были под руками, то есть быть членом соответствующей группы.


Другой пример - пароль к СУБД. Нам его нужно знать когда мы настраиваем СУБД (чтобы добавить) и в тот момент, когда настраиваем приложение (чтобы вписать пароль в конфиг). Если у нас будет execution на эту группу, то мы либо впишем пароль в конфиг на сервере субд (нафига?), либо будем пытаться обновить настройки СУБД на хостах без СУБД (либо лишняя нагрузка, либо ошибка).

Мы делаем группу: database_credentials, которая в себя включает как database_server, так и database_clients. Каждый читает эти переменные для своих нужд.

Аналогично надо делать и для query groups. Если мы хотим знать все IP всех слейвов, то это не означает, что все слейвы должны иметь одинаковые роли и таски. Мы разделяем абстрактное "слейвы" и практическое "слейвы первого типа", "слейвы второго типа". Аналогично, группы надо наследовать.


(Я бы хотел услышать критику от ansible'оводов)
Tags: ansible
Subscribe

  • ансибло-философия

    А вот я хочу продолжить думать умное про ансибл, ci/cd и прочую рабочую фигню между гитом и сервером. Классическое программирование стремится…

  • APython

    troll mode: Специальный интерпретатор питона, написанный на ансибле с помощью конечного автомата на хэндлерах. В начале делается set_fact для code с…

  • molecule

    Мы всё-таки пытаемся притащить молекулу в продакшен (в смысле, в тесты кода для продакшена). Основная проблема состоит в том, что molecule…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments