Урок 6-9: Переменные, шаблоны, роли и Vault

Pavel 08.12.2025 18:43 12 просмотров

Часть 1: Переменные в Ansible

Объявление переменных

---
- name: Работа с переменными
  hosts: webservers

  # Переменные на уровне playbook
  vars:
    web_server: nginx
    app_port: 8080
    app_user: appuser
    config_path: /etc/nginx

  # Переменные из файла
  vars_files:
    - vars/main.yml
    - vars/secret.yml

  tasks:
    - name: Использовать переменные
      debug:
        msg: "Сервер: {{ web_server }}, Порт: {{ app_port }}"

Group и Host переменные

Файл: group_vars/webservers.yml

---
# Переменные для группы webservers
web_server: nginx
app_port: 8080
max_connections: 1000

Файл: host_vars/web1.yml

---
# Переменные для конкретного хоста web1
hostname: web1.example.com
ip_address: 192.168.1.10
ssl_cert_path: /etc/ssl/certs/web1.crt

Типы переменных

---
- name: Различные типы переменных
  hosts: all

  vars:
    # Строка
    app_name: "myapp"

    # Число
    port: 8080

    # Булево значение
    enable_ssl: true

    # Список
    packages:
      - nginx
      - curl
      - git

    # Словарь (объект)
    database:
      host: localhost
      port: 5432
      name: myapp_db

    # Сложная структура
    users:
      - name: john
        groups: [sudo, wheel]
        age: 25
      - name: jane
        groups: [sudo]
        age: 30

  tasks:
    - name: Использовать список
      debug:
        msg: "Пакет: {{ packages[0] }}"

    - name: Использовать словарь
      debug:
        msg: "БД хост: {{ database.host }}"

    - name: Итерировать список
      debug:
        msg: "Пакет: {{ item }}"
      loop: "{{ packages }}"

    - name: Итерировать словарь
      debug:
        msg: "Пользователь: {{ item.name }}, возраст: {{ item.age }}"
      loop: "{{ users }}"

Факты (Facts)

---
- name: Использование фактов
  hosts: all
  gather_facts: yes  # Собрать информацию о системе

  tasks:
    - name: Показать имя хоста
      debug:
        msg: "Имя: {{ ansible_hostname }}"

    - name: Показать ОС
      debug:
        msg: "ОС: {{ ansible_os_family }}"

    - name: Показать версию Python
      debug:
        msg: "Python: {{ ansible_python_version }}"

    - name: Показать IP адреса
      debug:
        msg: "IP: {{ ansible_all_ipv4_addresses }}"

    - name: Показать свободную память
      debug:
        msg: "Память: {{ ansible_memfree_mb }} MB"

Register (Сохранение результатов)

---
- name: Register переменные
  hosts: all

  tasks:
    - name: Выполнить команду
      shell: df -h / | tail -1
      register: disk_info

    - name: Использовать результат
      debug:
        var: disk_info.stdout

    - name: Условие на основе результата
      debug:
        msg: "Мало места!"
      when: disk_info.stdout | regex_search('9[0-9]%')

Часть 2: Шаблоны (Templates)

Основы Jinja2 шаблонов

Файл: templates/nginx.conf.j2

server {
    listen {{ app_port }};
    server_name {{ app_hostname }};

    # SSL сертификат
    {% if enable_ssl %}
    listen 443 ssl;
    ssl_certificate {{ ssl_cert_path }};
    ssl_certificate_key {{ ssl_key_path }};
    {% endif %}

    # Логи
    access_log /var/log/nginx/{{ app_name }}_access.log;
    error_log /var/log/nginx/{{ app_name }}_error.log;

    # Проксирование
    location / {
        proxy_pass http://127.0.0.1:{{ backend_port }};
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Использование шаблонов в Playbook

---
- name: Развернуть конфиг с шаблоном
  hosts: webservers
  become: yes

  vars:
    app_name: myapp
    app_port: 80
    app_hostname: app.example.com
    backend_port: 8080
    enable_ssl: true
    ssl_cert_path: /etc/ssl/certs/app.crt
    ssl_key_path: /etc/ssl/private/app.key

  tasks:
    - name: Создать конфиг из шаблона
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/sites-available/{{ app_name }}.conf
        owner: root
        group: root
        mode: '0644'
      notify: Перезагрузить Nginx

  handlers:
    - name: Перезагрузить Nginx
      service:
        name: nginx
        state: restarted

Фильтры Jinja2

---
- name: Фильтры
  hosts: all

  vars:
    text: "Hello World"
    number: 42
    list_items: [1, 2, 3, 4, 5]

  tasks:
    - name: Преобразование текста
      debug:
        msg: |
          Uppercase: {{ text | upper }}
          Lowercase: {{ text | lower }}
          Capitalize: {{ text | capitalize }}
          Length: {{ text | length }}

    - name: Математика
      debug:
        msg: |
          Число: {{ number }}
          Чётное: {{ number % 2 == 0 }}
          Плюс 10: {{ number + 10 }}

    - name: Работа со списками
      debug:
        msg: |
          First: {{ list_items | first }}
          Last: {{ list_items | last }}
          Length: {{ list_items | length }}
          Join: {{ list_items | join(',') }}

    - name: Условные фильтры
      debug:
        msg: "{{ text | default('No value') }}"

Часть 3: Роли (Roles)

Структура роли

roles/
└── webserver/
    ├── tasks/
       └── main.yml              # Основные задачи
    ├── handlers/
       └── main.yml              # Handlers
    ├── templates/
       ├── nginx.conf.j2
       └── index.html.j2
    ├── files/
       └── nginx.default
    ├── vars/
       └── main.yml              # Переменные роли
    ├── defaults/
       └── main.yml              # Значения по умолчанию
    ├── meta/
       └── main.yml              # Информация о роли
    └── README.md

Создание простой роли

Файл: roles/webserver/tasks/main.yml

---
- name: Установить Nginx
  apt:
    name: nginx
    state: present

- name: Скопировать конфиг
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify: Перезагрузить Nginx

- name: Запустить Nginx
  service:
    name: nginx
    state: started
    enabled: yes

Файл: roles/webserver/handlers/main.yml

---
- name: Перезагрузить Nginx
  service:
    name: nginx
    state: restarted

Файл: roles/webserver/defaults/main.yml

---
app_port: 80
app_name: default
backend_port: 8080
enable_ssl: false

Использование ролей в playbook

---
- name: Развернуть веб-приложение
  hosts: webservers
  become: yes

  roles:
    - webserver
    - monitoring
    - security

Роли с параметрами

---
- name: Развернуть несколько приложений
  hosts: all
  become: yes

  roles:
    - role: webserver
      vars:
        app_port: 8080
        app_name: app1

    - role: webserver
      vars:
        app_port: 8081
        app_name: app2

    - role: database
      vars:
        db_type: postgres
        db_version: 13

Часть 4: Ansible Vault (Секреты)

Создание Vault файла

# Создать новый зашифрованный файл
ansible-vault create secrets.yml

# Введите пароль и добавьте содержимое:
# db_password: "super_secret_password"
# api_key: "sk_live_..."

Команды Vault

# Просмотреть содержимое
ansible-vault view secrets.yml

# Отредактировать файл
ansible-vault edit secrets.yml

# Зашифровать существующий файл
ansible-vault encrypt credentials.yml

# Расшифровать файл
ansible-vault decrypt secrets.yml

# Изменить пароль
ansible-vault rekey secrets.yml

# Вывести содержимое в plaintext (осторожно!)
ansible-vault view secrets.yml --vault-password-file=password.txt

Использование Vault в playbook

# Запустить playbook с запросом пароля
ansible-playbook site.yml --ask-vault-pass

# Или с файлом пароля
ansible-playbook site.yml --vault-password-file=.vault_pass

# Или указать пароль через переменную окружения
export ANSIBLE_VAULT_PASSWORD_FILE=.vault_pass
ansible-playbook site.yml

Файл: .vault_pass (НЕ коммитить в Git!)

my_secret_password

Файл: group_vars/all/vault.yml (Зашифрованный)

---
# Зашифровано с помощью ansible-vault
db_password: !vault |
  $ANSIBLE_VAULT;1.1;AES256
  66386d8445c2f5...

Использование в playbook:

---
- name: Использовать секреты
  hosts: all

  vars_files:
    - group_vars/all/vault.yml

  tasks:
    - name: Подключиться к БД
      postgres_db:
        name: myapp
        login_password: "{{ db_password }}"

Проверочный список

  • [ ] Создаете и используете переменные
  • [ ] Работаете с group/host переменными
  • [ ] Используете факты системы
  • [ ] Регистрируете результаты команд
  • [ ] Создаете шаблоны с Jinja2
  • [ ] Создали простую роль
  • [ ] Используете роли в playbooks
  • [ ] Защищаете секреты через Vault

Готовы? Переходите к продвинутым техникам! 🚀

Комментарии (0)

Для добавления комментария необходимо войти в аккаунт

Войти / Зарегистрироваться