Введение
Этот учебник проведет вас через использование vars_files в Ansible для эффективного управления конфигурацией. Ansible – это мощный инструмент автоматизации, который помогает управлять инфраструктурой с помощью простых, читаемых человеком YAML-файлов. Функция vars_files позволяет хранить данные конфигурации отдельно от логики автоматизации, что делает ваши проекты Ansible более организованными и удобными в обслуживании.
К концу этого учебника вы узнаете, как создавать и организовывать vars_files, включать их в плейбуки и эффективно использовать их для управления различными средами. Эти знания помогут вам построить более масштабируемую и поддерживаемую автоматизацию инфраструктуры.
Установка Ansible и создание первого vars_file
На этом первом шаге мы установим Ansible в нашей системе и создадим наш первый vars_file для хранения данных конфигурации.
Установка Ansible
Давайте начнем с установки Ansible в нашей системе Ubuntu:
sudo apt update
sudo apt install -y ansible
После завершения установки убедитесь, что Ansible установлен правильно:
ansible --version
Вы должны увидеть вывод, аналогичный этому, показывающий версию Ansible и конфигурацию:
ansible [core 2.12.x]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.x (default, Mar 14 2023, 14:21:35) [GCC 11.3.0]
jinja version = 3.0.3
libyaml = True
Создание структуры каталогов проекта
Давайте создадим структуру каталогов для нашего проекта Ansible:
mkdir -p ~/project/ansible-vars-demo/vars
cd ~/project/ansible-vars-demo
Понимание vars_files в Ansible
vars_files в Ansible – это YAML-файлы, которые хранят определения переменных, которые можно импортировать в плейбуки. Эти файлы позволяют вам:
- Отделить данные конфигурации от логики автоматизации
- Повторно использовать одни и те же переменные в нескольких плейбуках
- Поддерживать разные конфигурации для разных сред
Создание вашего первого vars_file
Давайте создадим наш первый vars_file для хранения настроек конфигурации веб-сервера. Используя WebIDE, создайте новый файл по адресу ~/project/ansible-vars-demo/vars/webserver.yml со следующим содержимым:
---
## Web Server Configuration
http_port: 80
server_name: example.com
document_root: /var/www/html
max_clients: 200
Этот vars_file определяет четыре переменные, которые могут использоваться при настройке веб-сервера:
http_port: Порт, на котором будет прослушивать веб-серверserver_name: Доменное имя для веб-сервераdocument_root: Каталог, в котором будут храниться файлы веб-сайтаmax_clients: Максимальное количество одновременных клиентских подключений
Чтобы понять, как это выглядит в WebIDE, перейдите к проводнику файлов в левой части, разверните папку project, затем ansible-vars-demo, затем vars, и вы должны увидеть свой файл webserver.yml. Щелкните по нему, чтобы просмотреть или отредактировать его содержимое.
Создание файла инвентаризации
Далее нам нужно создать файл инвентаризации, чтобы сообщить Ansible, какими хостами управлять. В реальной среде он будет содержать фактические адреса серверов, но для этого учебника мы будем использовать localhost.
Создайте новый файл по адресу ~/project/ansible-vars-demo/inventory.ini со следующим содержимым:
[webservers]
localhost ansible_connection=local
Эта простая инвентаризация определяет группу под названием webservers, которая включает только нашу локальную машину.
Понимание структуры проекта
На данный момент структура вашего проекта должна выглядеть так:
ansible-vars-demo/
├── inventory.ini
└── vars/
└── webserver.yml
Эта базовая структура отделяет нашу инвентаризацию (какими хостами управлять) от наших определений переменных (как настраивать эти хосты).
Создание базового плейбука с vars_files
Теперь, когда мы создали наш vars_file, давайте создадим простой плейбук Ansible, который использует эти переменные. Это продемонстрирует, как импортировать и использовать данные конфигурации из vars_files.
Понимание плейбуков Ansible
Плейбуки Ansible – это YAML-файлы, которые определяют набор задач для выполнения на управляемых хостах. Плейбуки являются основой функциональности Ansible, позволяя автоматизировать сложные процессы конфигурации.
Создание простого плейбука
Давайте создадим плейбук, который будет имитировать настройку веб-сервера, используя переменные, которые мы определили в нашем vars_file. Создайте новый файл по адресу ~/project/ansible-vars-demo/webserver_setup.yml со следующим содержимым:
---
- name: Configure Web Server
hosts: webservers
vars_files:
- vars/webserver.yml
tasks:
- name: Display web server configuration
debug:
msg: "Web server will be configured with: Port={{ http_port }}, ServerName={{ server_name }}, DocumentRoot={{ document_root }}"
- name: Create a directory for document root
file:
path: "/tmp/{{ document_root }}"
state: directory
mode: "0755"
- name: Create a sample index.html file
copy:
content: |
<html>
<head>
<title>Welcome to {{ server_name }}</title>
</head>
<body>
<h1>Welcome to {{ server_name }}</h1>
<p>This server is configured to handle {{ max_clients }} simultaneous connections.</p>
</body>
</html>
dest: "/tmp/{{ document_root }}/index.html"
mode: "0644"
Давайте разберемся, что делает этот плейбук:
hosts: webservers- Указывает, что этот плейбук должен запускаться на всех хостах в группе "webservers" из нашей инвентаризации.vars_files: - vars/webserver.yml- Импортирует переменные из нашегоvars_file.- Первая задача использует модуль
debugдля отображения сообщения, показывающего переменные. - Вторая задача создает структуру каталогов, которая будет использоваться для корневого каталога веб-сервера.
- Третья задача создает пример HTML-файла, который включает переменные из нашего
vars_file.
Запуск плейбука
Теперь давайте запустим плейбук, чтобы увидеть его в действии:
cd ~/project/ansible-vars-demo
ansible-playbook -i inventory.ini webserver_setup.yml
Вы должны увидеть вывод, аналогичный этому:
PLAY [Configure Web Server] ****************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Display web server configuration] ****************************************
ok: [localhost] => {
"msg": "Web server will be configured with: Port=80, ServerName=example.com, DocumentRoot=/var/www/html"
}
TASK [Create a directory for document root] ************************************
changed: [localhost]
TASK [Create a sample index.html file] *****************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Проверка результатов
Давайте проверим, что наш плейбук создал ожидаемые файлы:
ls -la /tmp/var/www/html/
cat /tmp/var/www/html/index.html
Вы должны увидеть структуру каталогов и содержимое файла index.html, который должен включать значения из нашего vars_file:
<html>
<head>
<title>Welcome to example.com</title>
</head>
<body>
<h1>Welcome to example.com</h1>
<p>This server is configured to handle 200 simultaneous connections.</p>
</body>
</html>
Понимание рабочего процесса
Давайте подведем итоги того, что мы сделали:
- Мы сохранили данные конфигурации в отдельном
vars_file(vars/webserver.yml). - Мы создали плейбук, который импортирует и использует эти данные конфигурации.
- Мы запустили плейбук для выполнения задач, которые используют переменные.
Это разделение данных конфигурации (vars_files) от логики автоматизации (плейбуки) делает наш код Ansible более удобным в обслуживании и повторном использовании. Теперь мы можем обновить конфигурацию, отредактировав только vars_file, не изменяя сам плейбук.
Работа с несколькими vars_files
Теперь, когда мы понимаем основы vars_files, давайте рассмотрим, как использовать несколько vars_files для управления различными средами. Это распространенная практика в реальных сценариях, когда у вас могут быть разные конфигурации для сред разработки, промежуточного развертывания и производства.
Создание vars_files, специфичных для среды
Давайте создадим vars_files для разных сред. Сначала создадим конфигурацию среды разработки:
Создайте новый файл по адресу ~/project/ansible-vars-demo/vars/dev_environment.yml со следующим содержимым:
---
## Development Environment Configuration
environment_name: development
debug_mode: true
log_level: debug
backup_frequency: weekly
max_memory: 512MB
Далее создадим конфигурацию производственной среды:
Создайте новый файл по адресу ~/project/ansible-vars-demo/vars/prod_environment.yml со следующим содержимым:
---
## Production Environment Configuration
environment_name: production
debug_mode: false
log_level: error
backup_frequency: daily
max_memory: 2048MB
Создание плейбука с несколькими vars_files
Теперь давайте создадим плейбук, который использует как нашу конфигурацию веб-сервера, так и конфигурации, специфичные для среды. Создайте новый файл по адресу ~/project/ansible-vars-demo/environment_setup.yml со следующим содержимым:
---
- name: Configure Environment
hosts: webservers
vars:
env: dev
vars_files:
- vars/webserver.yml
- "vars/{{ env }}_environment.yml"
tasks:
- name: Display environment details
debug:
msg: >
Setting up {{ environment_name }} environment with the following parameters:
- Web Server: {{ server_name }} on port {{ http_port }}
- Debug Mode: {{ debug_mode }}
- Log Level: {{ log_level }}
- Backup Frequency: {{ backup_frequency }}
- Max Memory: {{ max_memory }}
- Max Clients: {{ max_clients }}
- name: Create environment config file
copy:
content: |
## Environment Configuration for {{ server_name }}
ENVIRONMENT={{ environment_name }}
DEBUG={{ debug_mode }}
LOG_LEVEL={{ log_level }}
BACKUP_FREQUENCY={{ backup_frequency }}
MAX_MEMORY={{ max_memory }}
HTTP_PORT={{ http_port }}
MAX_CLIENTS={{ max_clients }}
dest: "/tmp/{{ environment_name }}_config.env"
mode: "0644"
Этот плейбук вводит несколько новых концепций:
- Мы устанавливаем переменную
env: devвнутри самого плейбука. - Мы включаем как наш
vars_fileвеб-сервера, так иvars_file, специфичный для среды. - Путь к
vars_fileсреды включает переменную:"vars/{{ env }}_environment.yml", которая вычисляется какvars/dev_environment.yml. - Задачи используют переменные из обоих
vars_files.
Запуск плейбука с разными средами
Давайте сначала запустим плейбук со средой разработки (которая уже является настройкой по умолчанию):
cd ~/project/ansible-vars-demo
ansible-playbook -i inventory.ini environment_setup.yml
Вы должны увидеть вывод, который включает настройки среды разработки:
TASK [Display environment details] ********************************************
ok: [localhost] => {
"msg": "Setting up development environment with the following parameters:\n- Web Server: example.com on port 80\n- Debug Mode: True\n- Log Level: debug\n- Backup Frequency: weekly\n- Max Memory: 512MB\n- Max Clients: 200"
}
Теперь давайте запустим тот же плейбук, но переопределим переменную env, чтобы использовать производственную среду:
ansible-playbook -i inventory.ini environment_setup.yml -e "env=prod"
Вы должны увидеть вывод, который включает настройки производственной среды:
TASK [Display environment details] ********************************************
ok: [localhost] => {
"msg": "Setting up production environment with the following parameters:\n- Web Server: example.com on port 80\n- Debug Mode: False\n- Log Level: error\n- Backup Frequency: daily\n- Max Memory: 2048MB\n- Max Clients: 200"
}
Проверка файлов конфигурации
Давайте проверим, что наш плейбук создал файлы конфигурации среды:
cat /tmp/development_config.env
cat /tmp/production_config.env
Вы должны увидеть два разных файла конфигурации, каждый с настройками из соответствующего vars_file среды.
Понимание приоритета переменных
Важно понимать, что при использовании нескольких vars_files Ansible следует определенному порядку приоритета для переменных. Если одно и то же имя переменной встречается в нескольких местах, значение, определенное позже, переопределит более ранние определения.
В нашем примере, если бы мы определили http_port как в файлах webserver.yml, так и в dev_environment.yml, приоритет имело бы значение из dev_environment.yml, потому что он включен позже в списке vars_files.
Такое поведение позволяет вам определять общие значения по умолчанию в одном файле, а затем переопределять определенные значения для разных сред.
Продвинутые методы работы с vars_files
На этом заключительном этапе мы рассмотрим некоторые продвинутые методы работы с vars_files в Ansible, включая иерархическую организацию переменных и реализацию организации переменных на основе ролей.
Иерархическая организация переменных
В сложных проектах часто полезно организовывать переменные иерархически. Давайте создадим структуру, в которой у нас будут:
- Общие переменные, применимые ко всем средам
- Переменные, специфичные для среды
- Переменные, специфичные для приложения
Сначала давайте создадим файл общих переменных:
Создайте новый файл по адресу ~/project/ansible-vars-demo/vars/common.yml со следующим содержимым:
---
## Common variables for all environments
organization: "Example Corp"
admin_email: "admin@example.com"
timezone: "UTC"
Далее давайте создадим переменные, специфичные для приложения:
Создайте новый файл по адресу ~/project/ansible-vars-demo/vars/database.yml со следующим содержимым:
---
## Database application variables
db_port: 3306
db_user: "dbuser"
db_name: "appdb"
db_max_connections: 100
Создание иерархического плейбука
Теперь давайте создадим плейбук, который демонстрирует использование этих иерархических переменных. Создайте новый файл по адресу ~/project/ansible-vars-demo/hierarchical_setup.yml со следующим содержимым:
---
- name: Hierarchical Variable Demo
hosts: webservers
vars:
env: dev
app: database
vars_files:
- "vars/common.yml"
- "vars/{{ env }}_environment.yml"
- "vars/{{ app }}.yml"
tasks:
- name: Display hierarchical configuration
debug:
msg: >
Configuration for {{ app }} in {{ environment_name }} environment:
- Organization: {{ organization }}
- Admin Email: {{ admin_email }}
- Timezone: {{ timezone }}
- Debug Mode: {{ debug_mode }}
- Log Level: {{ log_level }}
- DB Port: {{ db_port }}
- DB User: {{ db_user }}
- DB Max Connections: {{ db_max_connections }}
- name: Create hierarchical config file
copy:
content: |
## {{ organization }} Configuration
## {{ environment_name }} Environment
## Common Settings
ADMIN_EMAIL={{ admin_email }}
TIMEZONE={{ timezone }}
## Environment Settings
DEBUG={{ debug_mode }}
LOG_LEVEL={{ log_level }}
BACKUP_FREQUENCY={{ backup_frequency }}
## {{ app | capitalize }} Settings
DB_PORT={{ db_port }}
DB_USER={{ db_user }}
DB_NAME={{ db_name }}
DB_MAX_CONNECTIONS={{ db_max_connections }}
dest: "/tmp/{{ environment_name }}_{{ app }}_config.conf"
mode: "0644"
Понимание групповых и хостовых переменных
В дополнение к vars_files, Ansible также поддерживает хранение переменных в специальных каталогах, называемых group_vars и host_vars. Давайте посмотрим, как они работают:
Создайте структуру каталогов для групповых и хостовых переменных:
mkdir -p ~/project/ansible-vars-demo/group_vars
mkdir -p ~/project/ansible-vars-demo/host_vars
Теперь создайте файл групповых переменных для группы 'webservers':
Создайте новый файл по адресу ~/project/ansible-vars-demo/group_vars/webservers.yml со следующим содержимым:
---
## Variables for all webservers
firewall_enabled: true
ssh_port: 22
monitoring_enabled: true
И создайте файл хостовых переменных для 'localhost':
Создайте новый файл по адресу ~/project/ansible-vars-demo/host_vars/localhost.yml со следующим содержимым:
---
## Variables specific to localhost
local_backup_path: "/tmp/backups"
is_development_machine: true
Создание плейбука со всеми типами переменных
Давайте создадим окончательный плейбук, который демонстрирует совместное использование всех типов переменных. Создайте новый файл по адресу ~/project/ansible-vars-demo/complete_setup.yml со следующим содержимым:
---
- name: Complete Variable Demo
hosts: webservers
vars:
env: prod
app: database
vars_files:
- "vars/common.yml"
- "vars/{{ env }}_environment.yml"
- "vars/{{ app }}.yml"
tasks:
- name: Display complete configuration
debug:
msg: >
Complete configuration for {{ inventory_hostname }}:
- Organization: {{ organization }}
- Environment: {{ environment_name }}
- Debug Mode: {{ debug_mode }}
- Firewall Enabled: {{ firewall_enabled }}
- SSH Port: {{ ssh_port }}
- Monitoring Enabled: {{ monitoring_enabled }}
- Local Backup Path: {{ local_backup_path }}
- Is Development Machine: {{ is_development_machine }}
- name: Create complete config file
copy:
content: |
## {{ organization }} - {{ environment_name }} Environment
## Host: {{ inventory_hostname }}
## Common Settings
ADMIN_EMAIL={{ admin_email }}
TIMEZONE={{ timezone }}
## Environment Settings
DEBUG={{ debug_mode }}
LOG_LEVEL={{ log_level }}
## Server Settings
FIREWALL_ENABLED={{ firewall_enabled }}
SSH_PORT={{ ssh_port }}
MONITORING_ENABLED={{ monitoring_enabled }}
## Host-specific Settings
LOCAL_BACKUP_PATH={{ local_backup_path }}
IS_DEVELOPMENT_MACHINE={{ is_development_machine }}
## {{ app | capitalize }} Settings
DB_PORT={{ db_port }}
DB_USER={{ db_user }}
DB_NAME={{ db_name }}
dest: "/tmp/complete_config.conf"
mode: "0644"
Запуск продвинутых плейбуков
Давайте запустим наш иерархический плейбук:
cd ~/project/ansible-vars-demo
ansible-playbook -i inventory.ini hierarchical_setup.yml
Вы должны увидеть вывод, который включает переменные из всех трех vars_files.
Теперь давайте запустим наш полный плейбук:
ansible-playbook -i inventory.ini complete_setup.yml
На этот раз вы должны увидеть вывод, который включает переменные из vars_files, group_vars и host_vars.
Проверка файлов конфигурации
Давайте проверим файлы конфигурации, созданные нашими продвинутыми плейбуками:
cat /tmp/dev_database_config.conf
cat /tmp/complete_config.conf
Понимание приоритета переменных в Ansible
При использовании нескольких источников переменных Ansible следует определенному порядку приоритета:
- Переменные командной строки (
-eили--extra-vars) - Переменные, определенные в плейбуке
- Переменные из включенных файлов и ролей
- Факты хоста
- Хостовые переменные (
host vars) - Групповые переменные (
group vars) - Переменные инвентаризации
- Переменные по умолчанию для ролей
Это означает, что переменные, определенные в host_vars, переопределят те же переменные, определенные в group_vars, которые, в свою очередь, переопределят те же переменные, определенные в vars_files.
Эта иерархическая структура дает вам мощный способ управления конфигурацией в разных средах, на хостах и в приложениях.
Резюме
В этом руководстве вы узнали, как эффективно использовать vars_files Ansible для управления конфигурацией. Вы:
- Установили Ansible и создали свой первый
vars_fileдля хранения данных конфигурации - Создали и запустили базовый плейбук, который использует
vars_filesдля разделения конфигурации и логики автоматизации - Работали с несколькими
vars_filesдля управления различными средами - Изучили продвинутые методы, включая иерархическую организацию переменных и использование
group_varsиhost_vars
Эти навыки обеспечивают прочную основу для создания масштабируемой и удобной в обслуживании автоматизации Ansible. Разделяя данные конфигурации и логику автоматизации, вы можете:
- Сделать ваши плейбуки более пригодными для повторного использования в разных средах
- Упростить процесс обновления значений конфигурации
- Управлять сложными конфигурациями структурированным способом
- Улучшить совместную работу, четко организуя данные конфигурации
Продолжая работать с Ansible, помните, что эффективное управление переменными является ключом к созданию удобной в обслуживании автоматизации. Методы, которые вы изучили в этом руководстве, помогут вам организовать ваши проекты Ansible по мере роста их сложности.


