Рубрики
Uncategorized

Anbible: idempotent playbooks

Anisible позволяет инфраструктуру в качестве кода. Это был ценный инструмент для моей инфраструктуры @ Home Project … Помечено с помощью Anbible, DevOps.

Anisible позволяет инфраструктуру в качестве кода. Это был ценный инструмент для моей инфраструктуры @ Home Project, помогая мне настроить программы консула и NOMAD, чтобы предоставить DNS для узлов и служб, а также конечную точку Nginx. Хотя эта инфраструктура была полностью заменена Kubernetes, Anbible — это инструмент, который остался, и обеспечивает постоянную поддержку задач технического обслуживания системы.

Работав с неизбежным в течение более длительного времени, мои сценарии теперь проживают в одном хорошо структурированном каталоге. Отсюда я могу запускать индивидуальные задачи, а также запустить полный сайт.yml Чтобы применить одно последовательное состояние конфигурации во все системы. Также полезно рассмотреть возможность удаления, которые удаляют ненужную конфигурацию или программное обеспечение. И для достижения идемпотентности вашего PlayBook, важно по-настоящему понять неиспользуемые модули, которые вы используете. Все это подробно описано в этой статье.

Эффективное каталог

Весь Anisible Code содержится в одном каталоге. На момент написания этой статьи этот каталог выглядит так:

├── ansible.cfg
├── host_vars
│   ├── raspi-3-1.yml
│   ├── ...
├── group_vars
├── roles
│   ├── consul
│   ├── docker-arch
│   ├── docker-arm
│   ├── nfs-client
│   ├── nfs-server
│   └── nomad
├── scripts
│   ├── consul
│   ├── nomad
│       ├── configs
│       ├── jobs
│   ├── system
│       ├── update_packages.yaml
│   ├── tutorial
│   └── uninstall
├── hosts
└── site.yml

Каталог структурирован в соответствии с этими принципами:

  • Глобальные файлы конфигурации в каталоге root: Anisible файлы конфигурации Ansible.cfg и инвентарь хозяева Отказ
  • Global Playbook: PlayBook сайт.yml Является ли IDEMPotent Playbook, который, когда выполняется, настраивает все узлы со всеми системами инфраструктуры. Эффективно он устанавливает все роли на все узлы и исправляет узлы на новейшие пакеты ОС.
  • Global Vars: group_vars Справочник содержит глобальные переменные, особенно IP-адреса для Nomad, Consul и NFS-серверов. В host_vars Справочник, я включаю файл для каждого узла, который определяет свою роль NOMAD/CONSUL/NFS как мастера или агента.
  • Разделительные роли и скрипты: роли Справочник содержит PlayBooks, которые устанавливают инфраструктурные системы. Это неизбежные роли, которые я объяснил в более ранних статьях. В Скрипты являются командами, которые регулярно выполняются, такие вещи, как обновление узлов или перезапуска процессов на узлах. Я также включаю развертывание рабочих мест NOMAD, включая Config файлы для программ, в каталоге сценариев.

Удалить

Обязательный связан с предоставлением погашения, последовательной конфигурации для систем. Но иногда вам нужно отменить эти изменения. Если это просто удаление программного обеспечения с соответствующим программным обеспечением управления пакетами, это простое задание. Но как насчет других конфигурации: пользовательские файлы сервисов, файлы конфигурации, добавленные строки конфигурации в центральные системные файлы, такие как /etc/mount или /etc/ssh/sshd_config. ?

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

Я структурую плейбов в Установить и Удалить блокировать. Эти блоки вызываются, передавая Удалить = True Параметр на прогон.

Вот укороченный пример для установки dnsmasq Отказ

- block:
    - name: Install dnsmasq
      apt:
        name: dnsmasq
        state: present
    - name: Configure dnsmasq
      lineinfile:
        path: /etc/dnsmasq.d/10_consul
        create: true
        line: server=/consul/192.168.2.201#8600
        regexp: consul
        state: present
  when: uninstall is not defined

- block:
    - name: Uninstall
      apt:
        name: dnsmasq
        state: absent
    - file:
        path: /etc/dnsmasq.d
        state: absent
  when: uninstall is defined and uninstall

Когда этот Playbook работает как Ansible-Playbook ... -E "{Удаление: True} , вывод выглядит следующим образом:

ansible-playbook site.yml --limit=raspi-3-1 --tags dns -e "{uninstall: true}"


PLAY [Configure DNS] ***********************************************************************************************************************

TASK [dns : Install dnsmasq] ***************************************************************************************************************
skipping: [raspi-3-1]

TASK [dns : Configure dnsmasq] *************************************************************************************************************
skipping: [raspi-3-1]

TASK [dns : Restart dnsmasq] ***************************************************************************************************************
skipping: [raspi-3-1]

TASK [dns : Uninstall] *********************************************************************************************************************
changed: [raspi-3-1]

TASK [dns : file] **************************************************************************************************************************
changed: [raspi-3-1]

Idempotent playbooks.

Когда PlayBook выполняется для настройки системы, система всегда должна иметь одинаковое, четкое определенное состояние. Если PlayBook состоит из 10 шагов, и система отклоняется на этапе 4 из желаемого состояния, то следует применять только этот конкретный шаг.

По своей природе, одновременные задачи будут изменять только систему, если есть что-то делать. Большинство неблагоприятных модулей обеспечивают эту идентификацию. Но некоторые модули могут быть использованы таким образом, чтобы разбивать этот шаблон. Я не могу покрыть все модули, но хочу выделить эту точку одним пример: модуль Линия в файле Отказ

Давайте рассмотрим настройку монтажа объема NFS. На клиентах вам нужно добавить запись в etc/fstab Чтобы рассказать системе, где есть сервер NFS. Первая версия этого изменения это:

- name: Create fstab entry
  lineinfile:
    path: /etc/fstab
    line: '{{ nfs_dir_server_ip }}:{{ nfs_dir_mnt_path }}  {{ nfs_dir_mnt_path }} nfs defaults,soft,bg,noauto,rsize=32768,wsize=32768,noatime  0 0'
    state: present

Определенный выход зависит от трех переменных. Если одно из переменных изменяется, и PlayBook выполняется снова, он создаст новую запись в /etc/fstab Отказ Крепления не будут работать!

Вы хотите только одну запись для акций NFS в этом файле. И для этого вы можете использовать дополнительные Regexp параметр. Вторая версия этого Playbook использует Regexp Параметр только для того, и когда-либо добавляют одну строку на /etc/fstab . Это простое изменение делает PlayBook IdEmpotent.

- name: Create fstab entry
  lineinfile:
    path: /etc/fstab
    line: '{{ nfs_dir_server_ip }}:{{ nfs_dir_mnt_path }}  {{ nfs_dir_mnt_path }} nfs defaults,soft,bg,noauto,rsize=32768,wsize=32768,noatime  0 0'
    regex: 'nfs defaults,soft,bg,noauto'
    state: present

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

Вывод

Во время непрерывного использования неизбежного, моя коллекция отдельных сценариев превратилась в одну эффективную структуру каталогов. Знание того, где именно для того, где можно поставить, какие файлы Playbook, переменные или конфигурации необходимы. Также при написании PlayBook всегда добавьте удален, чтобы отменить изменение системы. Наконец, обязательно напишите IDEMPotent Playbooks, чтобы повторяющиеся исполнение игрового книги всегда приводит к одному чековым, согласованным состоянию системы.

Оригинал: «https://dev.to/admantium/ansible-idempotent-playbooks-4e67»