Рубрики
Uncategorized

Реализация инфраструктуры — как-код с помощью Anisible и Git

Что такое «инфраструктура — как-код»? Чтобы сохранить концепцию простой, подумайте о вашей инфраструктуре … Помечено с помощью Anbible, Linux, Automation, Devops.

Что такое «инфраструктура — как-код»?

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

Используя эту информацию, вы должны иметь возможность воспроизвести картинку в любое время, которое вам нужно, и результат всегда должен быть таким же, как оригинал.

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

Вызовы

Чтобы успешно реализовать инфраструктуру-вспомогательное особое внимание для подбора средств поддержки и определения концептуальной модели, которая будет представлять управляемую среду:

  • Инструмент автоматизации: принимает под управление конфигурацией инфраструктуры и выполняет необходимые действия для достижения желаемого конечного состояния.
  • Репозиторий и версификация кода: хранит инфраструктуру-модель и сценарии автоматизации для управления инфраструктурой и отслеживаемыми изменениями.
  • Инфраструктура-модель: концептуальная модель данных, которая описывает желаемое конечное состояние инфраструктуры.

Реализация инфраструктуры-как-кода

Давайте возьмем следующий пример сценарии, чтобы продемонстрировать процедуру реализации:

  • Окружающая среда: домашний офис
  • Аналогичный контрольный узел: маленький ПК или VM, установленный с CentOS 8.4
  • Аслыжные управляемые узлы: ноутбуки с Ubuntu и рабочими станциями с CentOS и Fedora

Перед началом процедуры реализации убедитесь, что следующие требования относятся:

  • Узел управления:
    • Openssh Client.
    • Sudo.
    • Python3.
    • Портить
    • Регулярный пользователь с Sudo Configured для пароля меньше корневой привилегии
  • Управляемые узлы:
    • Установка свежей ОС (стандартная настройка)
    • Openssh сервер
    • Sudo.
    • Python3.
    • Регулярный пользователь с Sudo Configured для пароля меньше корневой привилегии

Определите модель инфраструктуры

Инфраструктурная модель будет иметь следующие структуры данных:

  • Сайт : Представляет группу Узлы которые управляются тем же УСЛУГИ УЗА Отказ
  • Узел : Вычислить узел, который способен размещать компоненты программного обеспечения, и это полностью управляется узлом управления.
  • Компонент : Индивидуальный программный продукт, который установлен в Узел Отказ
  • Сервис : Группа Компоненты настроен в одном или нескольких Узлы служить конкретной функции.

Структуры данных будут реализованы с использованием аварийных запасов, Host_Vars и Group_vars:

  • Инвентарь : Hosts.ini Файл будет использоваться для объявления всех Узлы Для цели Сайт . Узлы будет сгруппирован на основе Услуга они предоставляют или используют.
  • Групповые панели : отдельные файлы yaml для Компоненты и Услуги будет создан для каждого Узел Группа объявлена в Инвентарь Отказ
  • HostVars : Отдельные файлы yaml будут использоваться для случаев, когда Узел требует дальнейшей настройки.

Создать репозиторий кода

Создайте выделенную учетную запись Linux. Это состоит в том, чтобы изолировать содержание от обычных пользователей и облегчить аудит деятельности. Изменить переменную оболочки Project_owner Чтобы изменить имя по умолчанию.

PROJECT_OWNER='sitectl'
sudo useradd -m "$PROJECT_OWNER"
sudo su - "$PROJECT_OWNER"

Создайте структуру каталогов проекта, которая будет содержать инфраструктурную модель и сценарии автоматизации. Обратитесь к Ошибные лучшие практики Документ для дальнейшего учиться о структуре каталогов. Изменить переменную оболочки Project_Path Чтобы изменить местоположение проекта по умолчанию.

export PROJECT_OWNER='sitectl'
export PROJECT_PATH="/home/${PROJECT_OWNER}/manager"
mkdir "$PROJECT_PATH"
cd "$PROJECT_PATH"
mkdir \
  'collections' \
  'files' \
  'inventories' \
  'inventories/group_vars' \
  'inventories/host_vars' \
  'playbooks' \
  'vars' \
  'etc' \
  'filter_plugins' \
  'library' \
  'module_utils' \
  'roles' \
  'var' \
  'templates'

Создайте простой скрипт оболочки для установки переменных среды для Anisible. Обратитесь к Обязательная конфигурация Документация, чтобы понять, что такое Ansible_ * Переменные оболочки делают.

cat > 'load_environment.sh' <<-EEOF
#!/bin/bash

declare -x PROJECT_OWNER='$PROJECT_OWNER'
declare -x PROJECT_PATH='$PROJECT_PATH'
declare -x PROJECT_END_STATE='${PROJECT_PATH}/inventories'

declare -x ANSIBLE_INVENTORY="\${PROJECT_END_STATE}/hosts.ini"
declare -x ANSIBLE_PRIVATE_KEY_FILE="/home/\${PROJECT_OWNER}/.ssh/id_rsa"
declare -x ANSIBLE_COLLECTIONS_PATHS="\${PROJECT_PATH}/collections"
declare -x ANSIBLE_ROLES_PATH="\${PROJECT_PATH}/roles"
declare -x ANSIBLE_GALAXY_CACHE_DIR="\${PROJECT_PATH}/var"
declare -x ANSIBLE_LOG_PATH="\${PROJECT_PATH}/var/ansible.log"
declare -x ANSIBLE_PYTHON_INTERPRETER='/usr/bin/python3.9'
declare -x ANSIBLE_PLAYBOOK_DIR="\${PROJECT_PATH}/playbooks"

PATH='/home/${PROJECT_OWNER}/.local/bin:/usr/bin:/usr/sbin'

EEOF

Создайте репозиторий код с помощью Git. Настройте .gitignore Файл Чтобы избежать изменений отслеживания в Ansible-Galaxy Install Install Target ( Коллекции/ ) и в репозитории для временных и летучих файлов ( /var )

source load_environment.sh
cat > '.gitignore' <<-EEOF
collections/
var/

EEOF
git config user.email "${PROJECT_OWNER}@localhost.localdomain"
git config user.name "$PROJECT_OWNER"
git init
git add .
git commit -m "Initial commit"

Настроить Anisible

Установите последний несмоткий двигатель на пользователь узел управления. Этот метод поддерживает окружающую среду, минимизирует зависимости распределения ОС и облегчает обновления модулей.

"$ANSIBLE_PYTHON_INTERPRETER" -m pip install ansible

Подготовьте удаленный доступ к несчастным управляемым узлам, используя клавиши OpenSSH. Изменить переменную оболочки Project_maned_nodes Чтобы представлять вашу среду и установить Project_Managed_user Переменная к удаленному имени пользователя с корневой привилегией меньше паролей.

PROJECT_MANAGED_NODES='host1 host2 host3 host4'
PROJECT_MANAGED_USER='sysadmin'
ssh-keygen -t rsa -f "$ANSIBLE_PRIVATE_KEY_FILE" -N ""
for x in $PROJECT_MANAGED_NODES; do
  ssh-copy-id -i "$ANSIBLE_PRIVATE_KEY_FILE" ${PROJECT_MANAGED_USER}@${x}
done

Создайте первоначальный Anisible Inventory, регистрацию следующих Узел Группы:

  • [Control_node] : Определяет неслымный узел.
  • [Managed_nodes] : Определяет однозначные управляемые узлы для целевого сайта.
  • [Office_nodes] : определяет Узлы это будет потреблять Офис-сервис Отказ Услуга предоставляет пользователям общие приложения производительности. Для этого примера мы будем использовать редактор изображений GIMP.
cat > "$ANSIBLE_INVENTORY" <<-EEOF
[control_node]
localhost

[managed_nodes]
$(for x in $PROJECT_MANAGED_NODES; do echo "$x"; done)

[office_nodes]
$(for x in $PROJECT_MANAGED_NODES; do echo "$x"; done)

EEOF

Создание репозиториев конфигурации конечных состояний. Именно здесь будет реализована инфраструктурная модель.

  • group_vars/ : Один каталог на хост-группу
  • group_vars/host_group_x/ : Один или несколько файлов YAML, представляющие компоненты, которые будут доступны для всех хостов в группе
  • host_vars/ : один каталог на хост
  • host_vars/hostx/ : один или несколько файлов YAML, представляющие компоненты, которые будут доступны для хоста
for x in control_node managed_nodes office_nodes; do
  mkdir "${PROJECT_END_STATE}/group_vars/${x}"
done
for x in $PROJECT_MANAGED_NODES; do
  mkdir "${PROJECT_END_STATE}/host_vars/${x}"
done

Определите компонентные конечные состояния

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

Определите, как является непредвиденным двигателем для подключения к управляемым узлам:

cat > "$PROJECT_END_STATE/group_vars/managed_nodes/ansible.yml" <<-EEOF
--------
ansible_user: "$PROJECT_MANAGED_USER"
ansible_become_method: "sudo"
...

EEOF

Определите атрибуты для Linux пользователи компонент. Это определение будет применено ко всем хостам в группе Managed_nodes :

cat > "$PROJECT_END_STATE/group_vars/managed_nodes/users.yml" <<-EEOF
--------
managed_nodes_users:
  - name: "user1"
    description: "Regular User 1"
    uid: "10100"
  - name: "user2"
    description: "Regular User 2"
    uid: "10101"
...

EEOF

Определите атрибуты для Пакет Linux компонент. Это определение будет применено ко всем хостам в группе Office_nodes :

cat > "$PROJECT_END_STATE/group_vars/office_nodes/packages.yml" <<-EEOF
--------
office_nodes_packages:
  flatpak:
    - "flatpak"
  gimp:
    - "org.gimp.GIMP"
...

EEOF

Принести сайт на целевое конечное состояние

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

Создайте Anisible Playbook, который настроит Managed_nodes Группа хостов:

cat > "$ANSIBLE_PLAYBOOK_DIR/managed_nodes.yml" <<-EEOF
--------
- name: "Manage Ansible Nodes"
  hosts: "managed_nodes"
  gather_facts: false

  tasks:
    - name: "Create Regular User Accounts"
      become: true
      ansible.builtin.user:
        create_home: true
        state: "present"
        name: "{{ item['name'] }}"
        comment: "{{ item['description'] | default( omit ) }}"
        uid: "{{ item['uid'] | default( omit ) }}"
      loop: "{{ managed_nodes_users }}"
...

EEOF

Создайте Anisible Playbook, который настроит Office_nodes Группа хостов:

cat > "$ANSIBLE_PLAYBOOK_DIR/office_nodes.yml" <<-EEOF
--------
- name: "Manage Office Nodes"
  hosts: "office_nodes"
  gather_facts: false

  pre_tasks:

    - name: "Install FlatPak tools"
      become: true
      ansible.builtin.package:
        name: "{{ office_nodes_packages['flatpak'] }}"
        state: "present"

    - name: "Prepare FlatPak repository"
      become: true
      ansible.builtin.command:
        argv:
          - "/usr/bin/flatpak"
          - "--system"
          - "remote-add"
          - "flatpak"
          - "https://flathub.org/repo/flathub.flatpakrepo"
      register: result
      changed_when:
        - result['rc'] == 0

  tasks:
    - name: "Install GIMP from FlatHub"
      become: true
      community.general.flatpak:
        name: "{{ office_nodes_packages['gimp'] }}"
        state: "present"
...

EEOF

Выполните плейговые книги, чтобы применить конечное состояние:

ansible-playbook playbooks/managed_nodes.yml
ansible-playbook playbooks/office_nodes.yml

Сохраните изменения в репозитории:

git add inventories
git add playbooks
git commit -m "add office_node and managed_node plays"

Следующие шаги

Теперь базовая структура вверх и работает больше контента, либо из асимущей галактики, либо разработанной в доме.

В дополнение к механизму автоматизации и репозитория кода вы должны оценить включение:

  • Код Linter: Обязательный свет и Yamllint может помочь сохранить код согласованным и стандартизированным.
  • Тестирование: Аналимая молекула Может использоваться для создания и запуска тестовых сред для тестирования внутренние роли
  • Предоставление: Террафом Может использоваться для автоматизации создания стандартизированных виртуальных машин

Исследуйте A: Platform64 Проект, который облегчает реализацию инфраструктуры — как-кода путем автоматизации большинства задач, описанных в этом руководстве.

Информация об авторских правах

Эта статья лицензирована под Creative Commons Attribution 4.0 Международная лицензия Отказ Для справки об авторских правах на продукт или продуктах упомянуты с ними, относятся к их соответствующему владельцу.

Отказ от ответственности

Мнения, представленные в этой статье, являются личными и относятся исключительно мне, и не представляют людей или организаций, связанные со мной в профессиональном или личном виде. Вся информация на этом сайте предоставляется «как есть» без гарантии полноты, точностью или результатами, полученными с использованием этой информации.

Оригинал: «https://dev.to/serdigital64/implementing-infrastructure-as-code-with-ansible-and-git-48ng»