DevOps: Управление инфраструктурой

Теория: Инфраструктура как код

Ниже приведён пример автоматизации создания дроплетов (серверов) Digital Ocean, а также генерация файлов инвентаризации из шаблона при помощи Ansible.

Пример файла playbook.yml

- name: Create Digital Ocean droplets
  # Запросы на создание выполняются на локальной машине
  # и стучатся в API Digital ocean
  hosts: localhost
  connection: local
  # Не используем факты с рабочей машины, поэтому отключаем
  gather_facts: no
  tasks:
    - name: Register DO ssh key
      # Регистрируем список ключей
      register: do_ssh_key
      community.digitalocean.digital_ocean_sshkey_info:
        # Все обращения к DO через модуль выполняются с использованием токена
        # Другой вариант - задавать переменную окружения DO_API_TOKEN
        oauth_token: "{{ do_oauth_token }}"

    - name: Create a new droplets
      community.digitalocean.digital_ocean_droplet:
        state: active
        wait: yes
        unique_name: yes
        wait_timeout: 120
        name: "example-droplet"
        oauth_token: "{{ do_oauth_token }}"
        # https://slugs.do-api.dev/
        size: "s-1vcpu-1gb"
        region: "ams3"
        image: "docker-20-04"
        # Добавляем в дроплет ключи, это может быть один ключ или несколько.
        # Для добавления нужны их ID
        ssh_keys:
          - "{{ do_ssh_key.data.0.id }}"
      # Если нам нужно нужно создать отдельные дроплеты, то используем цикл
      # with_items: "{{ droplets_params | list }}"

    - name: Create example from loop template
      # Файл будет искаться в tempplates
      # Переменные внутри файла будут браться из объявленных,
      # либо можно объявить свои переменные через vars
      # vars:
      #   my_list:
      #     - name: abc
      #       description: example
      template:
        src: example.j2
        dest: example.txt

Пример файла requirements.yml

roles: []
# Коллекция для работы с DO
collections:
- community.digitalocean

Пример файла vault-password

vault-password

Пример файла .gitignore

# Файл с паролем должен быть в игноре и не попадать в репозиторий
# Закомментирован, чтобы показать пример
# vault-password

Пример файла example.txt

test test

Пример файла host_vars/localhost/vars.yml

config:
  param1: value1
  param2: value2
  param3: value2
my_list:
  - name: value1
    description: example description 1
  - name: value2
    description: example description 2
# Шифрованная переменная находится в файле, ссылаемся на нее
some_token: "{{ vault_some_token }}"

Пример файла host_vars/localhost/vault.yml

$ANSIBLE_VAULT;1.1;AES256
62326639633236353537626166386639376164346137383433333862356138343734333732373161
3033383764303031393337633131613363383737306133340a396466326130663533393036313762
33623532303134323261326239383336663961616364316335323432383830353637343961643035
6663643732626563310a326364396164303239663332646435353336386263303138366331366430
62663130666564396462666135306137396438346336303032336161363133353366

Пример файла templates/example.j2

{# выполнение цикла #}
{% for my_item in my_list %}
{{my_item.name}} {{my_item.description}}
{% endfor %}