Введение
Ansible – это мощный инструмент автоматизации IT, упрощающий управление инфраструктурой. В этой практической лабораторной работе вы узнаете, как использовать Ansible для создания файлов с определенным содержимым на целевых системах. К концу этой лабораторной работы вы поймете основы управления файлами в Ansible и сможете реализовать автоматизированное создание файлов в своей собственной инфраструктуре.
Установка и настройка Ansible
Прежде чем мы начнем использовать Ansible для создания файлов, нам нужно установить и настроить его в нашей системе. Давайте настроим нашу среду:
Установка Ansible
Сначала мы обновим списки пакетов и установим Ansible в нашей системе Ubuntu 22.04:
sudo apt update
sudo apt install -y ansible
После выполнения этих команд вы должны увидеть вывод, указывающий на успешную установку Ansible. Давайте проверим установку:
ansible --version
Вы должны увидеть вывод, похожий на этот:
ansible [core 2.12.0]
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, ...) [GCC 11.2.0]
jinja version = 3.0.3
libyaml = True
Создание простого инвентаря Ansible
Ansible использует файл инвентаря (inventory) для определения хостов, которыми он будет управлять. Для этой лабораторной работы мы создадим локальный инвентарь, который включает нашу собственную машину:
- Создайте новую директорию для нашего проекта Ansible:
mkdir -p ~/project/ansible-files
cd ~/project/ansible-files
- Создайте файл инвентаря, используя VSCode:
- Нажмите на значок Explorer в WebIDE
- Перейдите в директорию
~/project/ansible-files - Щелкните правой кнопкой мыши и выберите "New File" (Новый файл)
- Назовите файл
inventory - Добавьте следующее содержимое в файл:
[local]
localhost ansible_connection=local
Этот файл инвентаря сообщает Ansible запускать команды на локальной машине без использования SSH.
- Создайте простой файл
ansible.cfgв той же директории:- Нажмите на значок Explorer в WebIDE
- Перейдите в директорию
~/project/ansible-files - Щелкните правой кнопкой мыши и выберите "New File" (Новый файл)
- Назовите файл
ansible.cfg - Добавьте следующее содержимое в файл:
[defaults]
inventory = ./inventory
host_key_checking = False
- Давайте проверим нашу настройку, выполнив простую команду Ansible:
cd ~/project/ansible-files
ansible local -m ping
Вы должны увидеть вывод, похожий на:
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
Это подтверждает, что Ansible правильно установлен и настроен для запуска команд на вашей локальной машине.
Создание файлов с содержимым с помощью Ansible Playbooks
Теперь, когда мы настроили Ansible, давайте узнаем, как создавать файлы с содержимым. Ansible предоставляет несколько модулей для управления файлами, и на этом шаге мы сосредоточимся на модуле copy.
Понимание Ansible Playbooks
Ansible Playbooks - это YAML-файлы, которые описывают набор задач, выполняемых на целевых хостах. Каждая задача использует определенный модуль Ansible для выполнения действия.
Давайте создадим наш первый playbook для создания файла с содержимым:
- В WebIDE создайте новый файл в директории
~/project/ansible-files:- Щелкните правой кнопкой мыши по директории и выберите "New File" (Новый файл)
- Назовите файл
create_file.yml - Добавьте следующее содержимое:
---
- name: Create a file with content
hosts: local
tasks:
- name: Create a simple text file
copy:
dest: "~/project/hello.txt"
content: |
Hello from Ansible!
This file was created using the Ansible copy module.
Current date: {{ ansible_date_time.date }}
Давайте разберемся, что делает этот playbook:
- Строка
hosts: localуказывает, что этот playbook будет запущен на хостах в группеlocalиз нашего инвентаря. - Раздел
tasksсодержит список задач для выполнения. - Модуль
copyиспользуется для создания файла с содержимым. - Параметр
destуказывает путь назначения для файла. - Параметр
contentсодержит текстовое содержимое, которое будет записано в файл. {{ ansible_date_time.date }}- это переменная, которая будет заменена текущей датой при запуске playbook.
- Теперь давайте запустим playbook:
cd ~/project/ansible-files
ansible-playbook create_file.yml
Вы должны увидеть вывод, похожий на:
PLAY [Create a file with content] ***********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a simple text file] ***********************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Давайте убедимся, что файл был создан и содержит ожидаемое содержимое:
cat ~/project/hello.txt
Вы должны увидеть вывод, похожий на:
Hello from Ansible!
This file was created using the Ansible copy module.
Current date: 2023-08-15
Дата будет отражать текущую дату при запуске playbook.
Идемпотентность в Ansible
Идемпотентность (Idempotence) - ключевая особенность Ansible - повторный запуск одного и того же playbook должен приводить к одному и тому же результату. Давайте снова запустим playbook, чтобы увидеть идемпотентность в действии:
ansible-playbook create_file.yml
На этот раз вы должны увидеть, что счетчик "changed" равен 0:
PLAY [Create a file with content] ***********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a simple text file] ***********************************************
ok: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Это показывает, что Ansible распознает, что файл уже существует с правильным содержимым, поэтому он не изменяет его снова.
Использование переменных и шаблонов в Ansible
На этом шаге мы рассмотрим, как использовать переменные и шаблоны для создания более динамичных файлов с помощью Ansible.
Работа с переменными
Переменные делают ваши playbooks более гибкими и многоразовыми. Давайте создадим playbook, который использует переменные для создания файла конфигурации:
- Создайте новый файл в WebIDE в директории
~/project/ansible-files:- Щелкните правой кнопкой мыши по директории и выберите "New File" (Новый файл)
- Назовите файл
variables_demo.yml - Добавьте следующее содержимое:
---
- name: Create files using variables
hosts: local
vars:
app_name: "MyApplication"
app_version: "1.0.0"
port_number: 8080
log_level: "INFO"
tasks:
- name: Create config file with variables
copy:
dest: "~/project/app_config.ini"
content: |
## Configuration for {{ app_name }}
## Generated by Ansible
[application]
name = {{ app_name }}
version = {{ app_version }}
[server]
port = {{ port_number }}
log_level = {{ log_level }}
В этом playbook:
- Раздел
varsопределяет переменные, которые можно использовать во всем playbook. - Ссылки на переменные осуществляются с использованием синтаксиса
{{ variable_name }}. - Модуль
copyиспользуется для создания файла с содержимым, которое включает эти переменные.
- Теперь давайте запустим playbook:
cd ~/project/ansible-files
ansible-playbook variables_demo.yml
Вы должны увидеть вывод, похожий на:
PLAY [Create files using variables] ********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create config file with variables] ***************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Давайте рассмотрим содержимое сгенерированного файла:
cat ~/project/app_config.ini
Вы должны увидеть вывод, похожий на:
## Configuration for MyApplication
## Generated by Ansible
[application]
name = MyApplication
version = 1.0.0
[server]
port = 8080
log_level = INFO
Использование шаблонов Jinja2
Для более сложного содержимого файлов Ansible поддерживает шаблоны Jinja2. Давайте создадим файл шаблона и используем его в playbook:
- Создайте директорию templates:
mkdir -p ~/project/ansible-files/templates
- Создайте файл шаблона в WebIDE:
- Перейдите в директорию
~/project/ansible-files/templates - Щелкните правой кнопкой мыши и выберите "New File" (Новый файл)
- Назовите файл
web_config.j2 - Добавьте следующее содержимое:
- Перейдите в директорию
## Web Server Configuration
## Generated by Ansible on {{ ansible_date_time.date }}
server {
listen {{ web_port }};
server_name {{ server_name }};
location / {
root {{ doc_root }};
index index.html;
}
{% if enable_ssl %}
## SSL Configuration
ssl_certificate {{ ssl_cert }};
ssl_certificate_key {{ ssl_key }};
{% endif %}
}
- Теперь создайте playbook, который использует этот шаблон:
- Перейдите в директорию
~/project/ansible-files - Щелкните правой кнопкой мыши и выберите "New File" (Новый файл)
- Назовите файл
template_demo.yml - Добавьте следующее содержимое:
- Перейдите в директорию
---
- name: Create files using templates
hosts: local
vars:
web_port: 80
server_name: "example.com"
doc_root: "/var/www/html"
enable_ssl: true
ssl_cert: "/etc/ssl/certs/example.com.crt"
ssl_key: "/etc/ssl/private/example.com.key"
tasks:
- name: Create web server config from template
template:
src: templates/web_config.j2
dest: ~/project/web_server.conf
В этом playbook:
- Модуль
templateиспользуется вместоcopy. - Параметр
srcуказывает на наш файл шаблона. - Параметр
destуказывает, где создать выходной файл. - Переменные, определенные в разделе
vars, будут использоваться в шаблоне.
- Запустите playbook:
cd ~/project/ansible-files
ansible-playbook template_demo.yml
Вы должны увидеть вывод, похожий на:
PLAY [Create files using templates] ********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create web server config from template] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Давайте рассмотрим сгенерированный файл конфигурации:
cat ~/project/web_server.conf
Вы должны увидеть вывод, похожий на:
## Web Server Configuration
## Generated by Ansible on 2023-08-15
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
## SSL Configuration
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
}
Обратите внимание, как шаблон Jinja2 был отрисован с нашими переменными, и условный раздел для SSL был включен, потому что enable_ssl было установлено в true.
Расширенное управление файлами с помощью Ansible
На этом заключительном шаге мы рассмотрим некоторые расширенные методы управления файлами с помощью Ansible, включая разрешения файлов, условное создание файлов и использование нескольких модулей, связанных с файлами.
Установка разрешений и владельцев файлов
При создании файлов часто необходимо установить определенные разрешения и владельцев. Давайте создадим playbook, который это демонстрирует:
- Создайте новый файл в WebIDE:
- Перейдите в директорию
~/project/ansible-files - Щелкните правой кнопкой мыши и выберите "New File" (Новый файл)
- Назовите файл
file_permissions.yml - Добавьте следующее содержимое:
- Перейдите в директорию
---
- name: Manage file permissions and ownership
hosts: local
tasks:
- name: Create a script file with execute permissions
copy:
dest: ~/project/script.sh
content: |
#!/bin/bash
echo "This script was created by Ansible"
echo "Current user: $(whoami)"
echo "Current directory: $(pwd)"
mode: "0755"
- name: Create a read-only configuration file
copy:
dest: ~/project/readonly.conf
content: |
## This is a read-only configuration file
setting1 = value1
setting2 = value2
mode: "0444"
В этом playbook:
- Параметр
modeиспользуется для установки разрешений файла. 0755означает чтение, запись и выполнение для владельца, а также чтение и выполнение для группы и других.0444означает только чтение для всех.
- Запустите playbook:
cd ~/project/ansible-files
ansible-playbook file_permissions.yml
Вы должны увидеть вывод, похожий на:
PLAY [Manage file permissions and ownership] **********************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a script file with execute permissions] **************************
changed: [localhost]
TASK [Create a read-only configuration file] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Давайте проверим разрешения созданных файлов:
ls -l ~/project/script.sh ~/project/readonly.conf
Вы должны увидеть вывод, похожий на:
-rwxr-xr-x 1 labex labex 118 Aug 15 12:34 /home/labex/project/script.sh
-r--r--r-- 1 labex labex 73 Aug 15 12:34 /home/labex/project/readonly.conf
- Давайте убедимся, что скрипт можно выполнить:
~/project/script.sh
Вы должны увидеть вывод, похожий на:
This script was created by Ansible
Current user: labex
Current directory: /home/labex/project/ansible-files
Условное создание файлов
Иногда вам нужно создавать файлы только при выполнении определенных условий. Давайте создадим playbook, который демонстрирует условное создание файлов:
- Создайте новый файл в WebIDE:
- Перейдите в директорию
~/project/ansible-files - Щелкните правой кнопкой мыши и выберите "New File" (Новый файл)
- Назовите файл
conditional_file.yml - Добавьте следующее содержимое:
- Перейдите в директорию
---
- name: Conditional file creation
hosts: local
vars:
environment: "development"
create_debug_file: true
create_backup: false
tasks:
- name: Create environment-specific configuration
copy:
dest: "~/project/{{ environment }}_config.yml"
content: |
## Configuration for {{ environment }} environment
debug: {{ 'enabled' if environment == 'development' else 'disabled' }}
log_level: {{ 'DEBUG' if environment == 'development' else 'INFO' }}
- name: Create debug log file
copy:
dest: ~/project/debug.log
content: |
## Debug log file
## Created: {{ ansible_date_time.iso8601 }}
mode: "0644"
when: create_debug_file
- name: Create backup directory
file:
path: ~/project/backup
state: directory
mode: "0755"
when: create_backup
В этом playbook:
- Директива
whenиспользуется для условного выполнения задач. - Условные выражения Jinja2 используются в содержимом файла для изменения значений в зависимости от переменных.
- Модуль
fileиспользуется для создания директории.
- Запустите playbook:
cd ~/project/ansible-files
ansible-playbook conditional_file.yml
Вы должны увидеть вывод, похожий на:
PLAY [Conditional file creation] **********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create environment-specific configuration] ******************************
changed: [localhost]
TASK [Create debug log file] **************************************************
changed: [localhost]
TASK [Create backup directory] ************************************************
skipped: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Обратите внимание, что задача "Create backup directory" (Создать директорию резервного копирования) была пропущена, потому что create_backup было установлено в false.
- Давайте рассмотрим созданные файлы:
cat ~/project/development_config.yml
cat ~/project/debug.log
ls -la ~/project/ | grep backup
Вы должны увидеть содержимое двух созданных файлов и убедиться, что директория резервного копирования не была создана.
Использование нескольких модулей, связанных с файлами
Ansible предоставляет несколько модулей для управления файлами. Давайте создадим playbook, который демонстрирует использование нескольких модулей, связанных с файлами:
- Создайте новый файл в WebIDE:
- Перейдите в директорию
~/project/ansible-files - Щелкните правой кнопкой мыши и выберите "New File" (Новый файл)
- Назовите файл
file_modules.yml - Добавьте следующее содержимое:
- Перейдите в директорию
---
- name: Demonstrate file-related modules
hosts: local
tasks:
- name: Create a directory
file:
path: ~/project/ansible_demo
state: directory
mode: "0755"
- name: Create a file using the copy module
copy:
dest: ~/project/ansible_demo/copied.txt
content: "This file was created using the copy module.\n"
- name: Create a symbolic link
file:
src: ~/project/ansible_demo/copied.txt
dest: ~/project/ansible_demo/link_to_copied.txt
state: link
- name: Create a file with blockinfile module
blockinfile:
path: ~/project/ansible_demo/block.txt
create: true
block: |
This is a block of text
that will be inserted
as a single unit.
marker: "## {mark} ANSIBLE MANAGED BLOCK"
В этом playbook:
- Модуль
fileиспользуется сstate: directoryдля создания директории. - Модуль
fileиспользуется сstate: linkдля создания символической ссылки. - Модуль
blockinfileиспользуется для создания файла с блоком текста, окруженным комментариями-маркерами.
- Запустите playbook:
cd ~/project/ansible-files
ansible-playbook file_modules.yml
Вы должны увидеть вывод, похожий на:
PLAY [Demonstrate file-related modules] ***************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a directory] *****************************************************
changed: [localhost]
TASK [Create a file using the copy module] ************************************
changed: [localhost]
TASK [Create a symbolic link] *************************************************
changed: [localhost]
TASK [Create a file with blockinfile module] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Давайте проверим результаты:
ls -la ~/project/ansible_demo/
cat ~/project/ansible_demo/copied.txt
cat ~/project/ansible_demo/link_to_copied.txt
cat ~/project/ansible_demo/block.txt
Вы должны увидеть:
- Директорию с именем
ansible_demo - Файл с именем
copied.txtс указанным содержимым - Символическую ссылку с именем
link_to_copied.txt, указывающую наcopied.txt - Файл с именем
block.txtс блоком текста, окруженным комментариями-маркерами
Вывод последней команды должен быть похож на:
## BEGIN ANSIBLE MANAGED BLOCK
This is a block of text
that will be inserted
as a single unit.
## END ANSIBLE MANAGED BLOCK
Это демонстрирует универсальность возможностей Ansible по управлению файлами.
Резюме
Поздравляем с завершением этой лабораторной работы по управлению файлами в Ansible. Вы изучили несколько важных концепций и методов:
- Как установить и настроить Ansible для базовых задач автоматизации
- Создание файлов с определенным содержимым с использованием модуля
copy - Использование переменных для динамизации содержимого ваших файлов
- Работа с шаблонами Jinja2 для более сложной генерации файлов
- Установка разрешений и владельцев файлов
- Реализация условного создания файлов на основе переменных
- Использование различных модулей Ansible для различных задач управления файлами
Эти навыки формируют прочную основу для автоматизации задач управления файлами в вашей инфраструктуре. С помощью Ansible вы можете обеспечить согласованность содержимого файлов на нескольких серверах, применять изменения контролируемым образом и вести проверяемую запись вашей конфигурации.
Чтобы продолжить свой путь обучения Ansible, рассмотрите возможность изучения более продвинутых тем, таких как роли, организация playbooks и интеграция Ansible с другими инструментами DevOps.


