Любое написание ansible-роли сопровождается планом. В этот план необходимо будет включить все, что необходимо будет установить и настроить. Вот наш план: Пункт 1. Первоначальная настройка сервера. Пункт 2. Установка LEMP. Пункт 3. Права и пользователь. Пункт 4. Настройка LEMP. Пункт 5. Перенос кода площадки и БД. Пункт 6. Тестирование. Пункт 7. Итог. Так как если рассмотреть все пункты в одной статье, то материал получается слишком объемным, было принято решение разделить его на две части. В первой части обсудим 1, 2 и 3 пункты плана. В следующей - 4, 5, 6, 7 пункты. На текущий момент в директории /var/ansible, которую мы создали и использовали в предыдущей статье, имеются файлы: hosts.txt - файл с ip адресами удаленных машин. playbook.yml - playbook из первой статьи. Генерируем роль, роль будет называться LEMP (название можете использовать любое). Открываем playbook.yml. Добавляем: name - название данного ansible проекта. hosts - на каких хостах запускать. become - использование sudo. roles - подключаем созданную роль. Сохраняем файл и выходим. Больше данный файл нам не понадобится. Структура директорий в директории ansible: .├── hosts.txt├── LEMP│   ├── defaults│   │   └── main.yml│   ├── files│   ├── handlers│   │   └── main.yml│   ├── meta│   │   └── main.yml│   ├── README.md│   ├── tasks│   │   ├── main.yml│   ├── templates│   ├── tests│   │   ├── inventory│   │   └── test.yml│   └── vars│       └── main.yml└── playbook.yml В данном пункте необходимо настроить сервер для работы веб приложений. Выполнить установку default приложений, настроить дату, название сервера и локализацию. Необходимо установить приложения и пакеты: dirmngr mc iotop htop telnet tcpdump nmap curl console-cyrillic hexedit sudo zip unzip patch pwgen vim less parted subversion ntp bzip2 lsof strace mutt s-nail ncdu smartmontools tree dnsutils logrotate rsyslog Необходимо настроить: время hostname локализацию Первое, что необходимо сделать, - зайти в директорию с заданиями по пути /var/ansible/LEMP/tasks/. Создаем yml-файл для пункта 1. Это необходимо, чтобы в дальнейшем удобнее было администрировать ansible-роль. Потому что все будет разделено по своим файлам и загружаться только тогда, когда нам это необходимо. Для каждого пункта статьи мы будем создавать отдельный файл конфигурации. Создаем yml файл. Название можно выбрать любое: Заходим в главный файл конфигурации в заданиях ./LEMP/tasks/main.yml. Необходимо подгрузить выше созданный файл конфигурации. Для этого используется модуль include_tasks и название файла: Сохраняем изменения в main.yml. Теперь начинаем редактировать default_settings.yml. Для установки нам потребуется использование shell модуль. Для начала необходимо обновить все репозитории. Добавляем:  name - название задания. shell - модуль, с помощью которого выполняется команда. Сохраняем и запускаем из директории, где лежит playbook.yml (/var/ansible/): Как видим из вывода, ошибки не наблюдается. Начинаем устанавливать приложения и пакеты. Также будем использовать модуль shell, так как нужных нам утилит достаточно много и устанавливать все через модуль apt будет достаточно долго и проблематично. В файл default_settings.yml добавляем: cmd - ключ, в котором мы указываем команду. Запускаем: Все установлено. Далее необходимо настроить время, локализацию и hostname. Нам понадобятся команды: Для установки времени: Для установки локализации: Для установки hostname: Так как у нас используются плавающие переменные, мы добавим их в директорию vars. Чтобы в дальнейшем на других серверах нам было удобно их менять. Плавающие переменные: Europe/Moscow ru_RU.UTF-8 en_US.UTF-8 DOMAIN_NAME Открываем файл, где указываем переменные для всего проекта. Файл находится по адресу: /etc/ansible/test/vars/main.yml Добавляем переменные: В дальнейшем для вызова переменной необходимо будет использовать скобки {{переменная}}. Идем в default_settings.yml и добавляем задания: Запускаем и проверяем. Для проверки можно отправить команду с помощью модуля shell. Все работает. Пункт 1 завершён. Итоговый файл default_settings.yml: В данном пункте необходимо установить: nginx apache2 mysql exim4 Для установки этих пакетов будем использовать модуль apt. Нам понадобится разделить установку пакетов по разным yml файлам. Так как в дальнейшем будет удобно добавлять и изменять конфигурации для каждого пакета по отдельности. Создаем 4 файла: Подключаем загрузку задач в main.yml: Добавляем в файл nginx_install.yml: - name - название задачи. apt - модуль. name - название пакета. state - версия пакета; в данном случае последняя доступная версия. Добавляем в файл apache2_install.yml: Добавляем в файл  exim4_install.yml: При установке mysql необходимо будет подключить репозитории. Открываем mysql_install.yml. Используем модуль get_url для загрузки deb. файла с официального сайта. get_url - модуль загрузки файла по ссылке, аналог wget. dest - место куда будет загружен файл. mode - присваиваем права загруженному файлу. Следующим действием необходимо установить скачанный репозиторий. Добавляем ключ репозитория и обновляем репозитории: Устанавливаем python-mysqldb для дальнейшего взаимодействия. Проверяем доступную версию и выводим на экран для проверки: Устанавливаем: Запускаем: Все необходимые нам 4 сервиса установлены. Для проверки можно отправить запрос на удаленный сервер с помощью shell модуля : Необходимо: Cоздать пользователя/домашнюю директорию. Настроить права директории /var/www. Создать БД и пользователя БД. Создаем конфигурационный файл для данного пункта: Подключаем конфигурацию в main-файле: Создаем структуру директорий по аналогии с нашей первой статьей. На данном этапе нам необходимо добавить переменные в /var/ansible/LEMP/vars, номер пользователя/группы в системе и пароль. Открываем default_user_settings.yml. Для добавление пользователя необходимо будет использовать модуль user и group. Добавляем группу: state - состояние группы, если группа будет имеется на сервер, то ansible не будет ее пересоздавать или пытаться изменить. gid - номер группы в системе  "{{ DOMAIN_NAME }}" - переменная которую мы добавляли в Пункте 1. Добавляем пользователя: password: "{{ user_password | password_hash('sha512') }}" - так как ansible не может передавать не зашифрованный пароль, мы его шифруем с помощью password_hash('sha512'). update_password: on_create - означает, что пароль будет добавлен только один раз при первом выполнении данной команды, то есть он не будет перезаписан в случае повторного запуска роли.   home: "/var/www/{{ DOMAIN_NAME }}" - домашняя директория пользователя. Таким образом, пользователь и группы созданы. Теперь необходимо создать структуру директорий. Нам поможет модуль file: path: "/var/www/{{ DOMAIN_NAME }}" - адрес директории owner: "{{ DOMAIN_NAME }}" - Присваиваем директорию пользователю group: "{{ DOMAIN_NAME }}" - Присваиваем директорию группе. mode: 0751 - права директории state: directory - означает, что создается именно директория а не файл. Структура директорий: .└── domain_name     ├── data     ├── log     │   ├── apache2     │   └── nginx     ├── sess     ├── tmp     └── upload Следующим шагом необходимо создать базу данных и пользователя базы данных. Так как настройка mysql ведется в определенном файле, будем использовать именно его (/var/ansible/LEMP/tasks/mysql_install.yml). Во-первых, необходимо создать root пароль. Добавляем root пароль в переменные /var/ansible/LEMP/vars/main.yml. Идем в /var/ansible/LEMP/tasks/mysql_install.yml. Добавляем: Используется модуль mysql_user.  name: root - имя пользователя которого используем в mysql.  host: "{{ item }}". - адреса хостов, на которых будет изменен пароль; все хосты указаны в   with_items.  password: "{{ mysql_root_password }}" - новый пароль. check_implicit_admin - производит проверку входа в mysql без пароля (если, например, пароль указан в .my.cnf в home директории); Если войти без пароля не удалось, будет использован пароль указанный в login_password. login_user: root и  login_password: '' пользователь и пароль, под которым мы заходим в mysql. priv: "*.*:ALL,GRANT" - какие привилегии присваиваем пользователю. state: present - присваиваем единоразово. Далее добавляем базу данных. Добавляем переменные название базы данных и пользователя в /var/ansible/LEMP/vars/main.yml: Идем обратно в /var/ansible/LEMP/tasks/mysql_install.yml. Добавляем базу данных: Используем модуль mysql_db. name: "{{name_db}}" - название базы данных. Добавляем пользователя и присваиваем права на базу данных. Пользователь базы данных и база данных созданы. Итоговые файлы в рамках данного пункта следующие: Файл mysql_install.yml: Файл переменных: В этой статье мы с вами рассмотрели первую половину практической части серии обучающих статей по ansible. Мы использовали на практике полученные знания из первой статьи. В следующей статье мы рассмотрим остальные пункты, после чего у нас будет готова полноценная ansible-роль для быстрого развертывания простых проектов. Также мы выложим данную ansible-роль на github для ознакомления.  Если у вас остались вопросы, можете задавать их в комментариях. Ставьте лайки и подписывайтесь на нас - в дальнейшем будем публиковать еще больше обучающих статьей. Также подписывайтесь на наш telegram-канал DevOps FM. Рекомендации для чтения: Зашита от dos/ddos. Обучение docker. 10 частых ошибок в настройке nginx. Настройка LEMP сервера с нуля.  Системный администратор