Про Ansible для новичков: Практика (часть II)

—

от автора

Эта статья представляет собой обучающий материал, который предназначен для начинающих системных администраторов, поэтому опытным специалистам можно смело его пропустить. Публикация является продолжением цикла обучающих статей вот, вот.

В этом материале мы будем практиковаться писать Ansible role для автоматического поднятия web-сервера.

Итак, как я уже упоминал в первой части, любое написание ansible-роли сопровождается планом. В этот план нужно включить все, что будет необходимо установить и настроить.

Если рассматривать все пункты в одной статье, то материал получается слишком объемным, — собственно, поэтому и было принято решение разделить его на две части. Вот наш план, в котором зачеркнуты первые три пункта, которые мы выполнили в первой части:

  1. Пункт 1. Первоначальная настройка сервера.

  2. Пункт 2. Установка LEMP.

  3. Пункт 3. Права и пользователь.

  4. Пункт 4. Настройка LEMP.

  5. Пункт 5. Перенос кода площадки и БД.

  6. Пункт 6. Тестирование.

  7. Пункт 7. Итог.

В этой статье выполним оставшиеся четыре этапа. Итак, на данный момент в директории /var/ansible находится:

.

├── hosts.txt

├── LEMP

│   ├── defaults

│   │   └── main.yml

│   ├── files

│   ├── handlers

│   │   └── main.yml

│   ├── meta

│   │   └── main.yml

│   ├── README.md

│   ├── tasks

│   │   ├── apache2_install.yml

│   │   ├── default_settings.yml

│   │   ├── default_user_settings.yml

│   │   ├── exim4_install.yml

│   │   ├── main.yml

│   │   ├── mysql_install.yml

│   │   └── nginx_install.yml

│   ├── templates

│   ├── tests

│   │   ├── inventory

│   │   └── test.yml

│   └── vars

│       └── main.yml

└── playbook.yml

Пункт 4. Первоначальная настройка сервера.

На этом этапе мы произведем настройку следующих сервисов:

  1. php

  2. nginx

  3. mysql

  4. apache2

  5. exim4

Настройка php.

Первым делом необходимо установить php на удаленный сервер. Для этого создаем пустой файл в /var/ansible/LEMP/tasks с названием php.yml. Используем модуль apt.

cd /var/ansible/LEMP/tasks touch php.yml

Добавляем:

- name: install php   apt: name={{ item }} update_cache=yes state=latest   with_items:   - git   - php   - php-curl   - php-gd   - php-mbstring   - php-xml   - php-xmlrpc   - php-soap   - php-intl   - php-zip
  1. with_items: — создаем массив переменных из необходимых нам пакетов.

  2. name={{ item }} — здесь мы используем массив item для установки php модулей. apt будет выполняться до тех пор, пока не установит все пакеты из массива item.

Не забываем подключать новый yml-файл в main.yml.

В main.yml добавляем.

#####install php   - include_tasks: php.yml

Для php нам необходимо будет передать php.ini файл.

Создаем директорию php и файл php-ansible.ini в /var/ansible/LEMP/files/.

cd /var/ansible/LEMP/files/ mkdir php touch php/php.ini

Вставляем в файл php-ansible.ini, после [PHP], любую необходимую вам конфигурацию:

[PHP]  

Далее необходимо передать этот файл в /etc/php/7.3/apache2/. Он автоматически загрузится и применится после перезагрузки интерпретатора php. В данном случае это apache2.

Открываем файл php.yml в заданиях (/var/ansible/LEMP/tasks/php.yml) и добавляем копирование файлов и перезагрузку apache2.

Добавляем:

- name: copy config   copy:     src: php/php-ansible.ini     dest: /etc/php/7.3/apache2  - name: restart apache2   service:     name: apache2     state: restarted

Настройка nginx.

  1. Для настройки нам необходимо перенести конфигурационные файлы nginx:

    1. nginx.conf;

    2. конфигурацию площадки. domain_name.conf.

  2. Включить площадку.

  3. Перезагрузить nginx.

Переходим в директорию /var/ansible/LEMP/files.

Создаем директорию nginx.

mkdir nginx cd nginx/

В директории nginx необходимо создать 2 файла: nginx.conf и domain_name.conf.

touch nginx.conf domain_name.conf
  1. nginx.conf необходимо передать в корневую директорию nginx

  2. domain_name.conf необходимо передать в sites-available.

В nginx.conf вставляем конфигурацию из нашей предыдущей статьи.

В domain_name.conf конфигурацию из нашей предыдущей статьи.

После добавления конфигурации переходим в ./tasks/nginx_install.yml.

Передаем конфигурацию на удаленный сервер с помощью модуля copy и file.

Добавляем:

  - name: Copy config.     copy:       src: nginx/nginx.conf       dest: /etc/nginx/nginx.conf    - name: Copy domain_name  config     copy:       src: nginx/domain_name.conf       dest: /etc/nginx/sites-available/domain_name.conf    - name: enable site domain_name     file:       src: /etc/nginx/sites-available/domain_name.conf       dest: /etc/nginx/sites-enabled/domain_name.conf       state: link    - name: restart nginx     service:       name: nginx       state: restarted
  1. src — файл в директории ./files;

  2. dest — адрес сохранения файла на удаленном сервере.

Запускаем и проверяем:

TASK [LEMP : include_tasks] ************************************************************************************************************************************************************************************* included: /var/ansible/LEMP/tasks/nginx_install.yml for ansible2 TASK [LEMP : Install nginx] ************************************************************************************************************************************************************************************* ok: [ansible2] TASK [LEMP : Copy config.] ************************************************************************************************************************************************************************************** changed: [ansible2] TASK [LEMP : Copy domain_name  config] ************************************************************************************************************************************************************************** changed: [ansible2] TASK [LEMP : enable site domain_name] *************************************************************************************************************************************************************************** changed: [ansible2] PLAY RECAP ****************************************************************************************************************************************************************************************************** ansible2                   : ok=4    changed=3    unreachable=0    failed=0

Конфигурация для nginx добавлена. 

Итог:

  1. Передается конфигурация nginx и domain_name.

  2. Создается символьная ссылка в sites-enabled.

  3. Перезагружается сервис.

Настройка mysql.

Необходимо создать конфигурационный файл mysql.cnf, после чего передать его на удаленный сервер.

Создаем директорию mysql в /var/ansible/LEMP/files.

cd /var/ansible/LEMP/files mkdir mysql cd mysql/ touch mysql.cnf

Вставляем после [mysqld] необходимую вам конфигурацию.

[mysqld] 

Открываем файл конфигурации ansible mysql /var/ansible/LEMP/tasks/mysql_install.yml

Передаем файл конфигурации на удаленный сервер и перезагружаем mysql.

Добавляем:

  - name: Copy config     copy:       src: mysql/mysql.cnf       dest: /etc/mysql/mysql.conf.d/mysql.cnf    - name: restart mysql     service:       name: mysql       state: restarted

Итог:

  1. Перезагружаем сервис mysql.

  2. Настройка mysql завершена.

Настройка apache2.

Делаем аналогичные действия как и у nginx

Необходимо передать

  1. apache2.conf

  2. domain_name.conf

  3. ports.conf

Создаем директорию и выше перечисленные файлы в директории /var/ansible/LEMP/files.

Конфигурации для apache2 и domain_name можно взять из следующих статей:

  1. Конфигурация apache2.conf

  2. Конфигурация domain_name.conf.

Настраиваем работу apache2 на 81 порту. Добавляем конфигурацию для ports.conf:

Listen 81 <IfModule ssl_module>          Listen 443 </IfModule>  <IfModule mod_gnutls.c>          Listen 443 </IfModule>

Далее идем в /var/ansible/LEMP/tasks/apache2_install.yml

Добавляем:

 - name: copy config     copy:       src: apache2/apache2.conf       dest: /etc/apache2/apache2.conf    - name: copy domain_name config     copy:       src: apache2/domain_name.conf       dest: /etc/apache2/sites-available/domain_name.conf    - name: enable site domain_name     file:       src: /etc/apache2/sites-available/domain_name.conf       dest: /etc/apache2/sites-enabled/domain_name.conf       state: link    - name: copy ports     copy:       src: apache2/ports.conf       dest: /etc/apache2/ports.conf    - name: restart apache2     service:       name: apache2       state: restarted

Итог:

  1. Передаются файлы конфигурации;

  2. Перезагружаем сервис apache2.

Настройка exim4.

Необходимо:

  1. Передать файл конфигурации /etc/exim4/update-exim4.conf.conf;

  2. Перезагрузить exim4.

Создаем директорию exim4 и файл update-exim4.conf.conf в /var/ansible/LEMP/files.

Добавляем в файл конфигурации exim4:

# /etc/exim4/update-exim4.conf.conf # # Edit this file and /etc/mailname by hand and execute update-exim4.conf # yourself or use 'dpkg-reconfigure exim4-config' # # Please note that this is _not_ a dpkg-conffile and that automatic changes # to this file might happen. The code handling this will honor your local # changes, so this is usually fine, but will break local schemes that mess # around with multiple versions of the file. # # update-exim4.conf uses this file to determine variable values to generate # exim configuration macros for the configuration file. # # Most settings found in here do have corresponding questions in the # Debconf configuration, but not all of them. # # This is a Debian specific file dc_eximconfig_configtype='local' dc_other_hostnames='domain_name' dc_local_interfaces='127.0.0.1 ; ::1' dc_readhost='' dc_relay_domains='' dc_minimaldns='false' dc_relay_nets='' dc_smarthost='' CFILEMODE='644' dc_use_split_config='false' dc_hide_mailname='' dc_mailname_in_oh='true' dc_localdelivery='mail_spool'

В данный файл добавляете нужную вам конфигурацию.

В файл конфигурации (/var/ansible/LEMP/tasks/exim4_install.yml) добавляем «копирование файла» и «перезагрузка exim4».

  - name: copy config     copy:       src: exim4/update-exim4.conf.conf       dest: /etc/exim4/update-exim4.conf.conf    - name: restart exim4     service:       name: exim4       state: restarted

Конфигурация для exim4 готова.

Структура директории files с конфигурацией:

├── files

│   ├── apache2

│   │   ├── apache2.conf

│   │   ├── domain_name.conf

│   │   └── ports.conf

│   ├── exim4

│   │   └── update-exim4.conf.conf

│   ├── mysql

│   │   └── mysql.cnf

│   ├── nginx

│   │   ├── domain_name.conf

│   │   └── nginx.conf

│   └── php

│       └── php-ansible.ini

На данный момент настройка сервисов завершена. Если необходимо прокидывать или менять дополнительные файлы, вы также их можете добавить и изменить по выше указанному методу.

Пункт 5. Перенос кода площадки и БД.

В данном пункте необходимо переместить dump площадки для загрузки в БД и перенести код площадки.

Нам понадобится 2 директории в директории files.

Это:

  1. mysql_dump — директория с дампом площадки;

  2. data — директория с кодом.

Для начала добавляем код площадки в директорию /data.

В нашем случае кодом площадки будет выступать установщик wordpress.

Далее переносим дамп вашей БД в директорию /mysql_dump.

Создаем новый yml-файл с названием file.yml по адресу /var/ansible/LEMP/tasks/.

Включаем его в main.yml

  ####add_site_file   - include_tasks: file.yml

Добавляем в него задание:

  - name: copy file domain_name     copy:       src: data/       dest: /var/www/domain_name/data/       owner: domain_name       group: domain_name    - name: copy dump     copy:       src: mysql_dump/dump.sql       dest: /tmp/dump.sql    - name: mysql_dump     mysql_db:       name: domain_name_db       state: import       target: /tmp/dump.sql       login_user: root       login_password: "{{ mysql_root_password }}"

Для того, чтоб загрузить дамп в БД, используется модуль mysql_db.

Файлы площадки и дамп переместили на сервер.

Пункт 6. Тестирование.

На данный момент структура директорий выглядит следующим образом:
.
├── hosts.txt
├── LEMP
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   │   ├── apache2
│   │   │   ├── apache2.conf
│   │   │   ├── domain_name.conf
│   │   │   └── ports.conf
│   │   ├── data
│   │   ├── exim4
│   │   │   └── update-exim4.conf.conf
│   │   ├── mysql
│   │   │   └── mysql.cnf
│   │   ├── mysql_dump
│   │   │   └── dump.sql
│   │   ├── nginx
│   │   │   ├── domain_name.conf
│   │   │   └── nginx.conf
│   │   └── php
│   │       └── php-ansible.ini
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   ├── apache2_install.yml
│   │   ├── default_settings.yml
│   │   ├── default_user_settings.yml
│   │   ├── exim4_install.yml
│   │   ├── file.yml
│   │   ├── main.yml
│   │   ├── mysql_install.yml
│   │   ├── nginx_install.yml
│   │   └── php.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml
├── php.ini
├── playbook.retry
└── playbook.yml

Конфигурация заданий в директории .tasks:

apache2_install.yml:

  - name: Install apache2     apt:       name: apache2       state: latest    - name: copy config     copy:       src: apache2/apache2.conf       dest: /etc/apache2/apache2.conf    - name: copy domain_name config     copy:       src: apache2/domain_name.conf       dest: /etc/apache2/sites-available/domain_name.conf    - name: copy ports     copy:       src: apache2/ports.conf       dest: /etc/apache2/ports.conf    - name: restart apache2     service:       name: apache2       state: restarted

default_settings.yml:

  - name: update repo.     shell: apt update    - name: install default app.     shell:       cmd: "apt install -y dirmngr mc iotop htop telnet tcpdump nmap curl hexedit sudo zip unzip patch pwgen vim less parted subversion ntp bzip2 lsof strace mutt s-nail ncdu smartmontools tree dnsutils logrotate rsyslog"    - name: time     shell:       cmd: "timedatectl set-timezone {{time_zone}}"    - name: locale settings     shell:       cmd: 'locale-gen {{locale1}} && update-locale LANG={{locale2}} LC_TIME="{{locale1}}"'    - name: hostname     shell:       cmd: "hostnamectl set-hostname {{DOMAIN_NAME}}"

default_user_settings.yml:

  - name: add group     group:       name: "{{ DOMAIN_NAME }}"       state: present       gid: "{{ Group_GID }}"    - name: add user     user:       name: "{{ DOMAIN_NAME }}"       password: "{{ user_password | password_hash('sha512') }}"       uid: "{{ User_uid }}"       group: "{{ DOMAIN_NAME }}"       state: present       update_password: on_create       home: "/var/www/{{ DOMAIN_NAME }}"       shell: /bin/bash    - name: create home directory     file:       path: "/var/www/{{ DOMAIN_NAME }}"       owner: "{{ DOMAIN_NAME }}"       group: "{{ DOMAIN_NAME }}"       mode: 0751       state: directory    - name: create other directory     file:       path: "/var/www/{{ DOMAIN_NAME }}/data"       owner: "{{ DOMAIN_NAME }}"       group: "{{ DOMAIN_NAME }}"       mode: 0755       state: directory    - name: create other directory     file:       path: "/var/www/{{ DOMAIN_NAME }}/log"       owner: "{{ DOMAIN_NAME }}"       group: "{{ DOMAIN_NAME }}"       mode: 0755       state: directory    - name: create other directory     file:       path: "/var/www/{{ DOMAIN_NAME }}/sess"       owner: "{{ DOMAIN_NAME }}"       group: "{{ DOMAIN_NAME }}"       mode: 0755       state: directory    - name: create other directory     file:       path: "/var/www/{{ DOMAIN_NAME }}/tmp"       owner: "{{ DOMAIN_NAME }}"       group: "{{ DOMAIN_NAME }}"       mode: 0755       state: directory    - name: create other directory     file:       path: "/var/www/{{ DOMAIN_NAME }}/upload"       owner: "{{ DOMAIN_NAME }}"       group: "{{ DOMAIN_NAME }}"       mode: 0755       state: directory    - name: create other directory     file:       path: "/var/www/{{ DOMAIN_NAME }}/log/apache2"       owner: "{{ DOMAIN_NAME }}"       group: "{{ DOMAIN_NAME }}"       mode: 0755       state: directory    - name: create other directory     file:       path: "/var/www/{{ DOMAIN_NAME }}/log/nginx"       owner: "{{ DOMAIN_NAME }}"       group: "{{ DOMAIN_NAME }}"       mode: 0755       state: directory

exim4_install.yml:

  - name: Install exim4     apt:       name: exim4       state: latest    - name: copy config     copy:       src: exim4/update-exim4.conf.conf       dest: /etc/exim4/update-exim4.conf.conf    - name: restart exim4     service:       name: exim4       state: restarted

main.yml:

#  - include_tasks: default_settings.yml   #####install mysql #  - include_tasks: mysql_install.yml   #####install nginx #  - include_tasks: nginx_install.yml   #####install apache2 #  - include_tasks: apache2_install.yml   #####install exim4 #  - include_tasks: exim4_install.yml   #####default user settings #  - include_tasks: default_user_settings.yml   #####install php #  - include_tasks: php.yml   #####copy file domain_name   - include_tasks: file.yml

mysql_install.yml:

  - name: add mysql repo     get_url:       url: https://dev.mysql.com/get/mysql-apt-config_0.8.6-1_all.deb       dest: "/tmp"       mode: 0440    - name: install mysql repo     apt: "deb=/tmp/mysql-apt-config_0.8.6-1_all.deb"     become: true    - name: add key mysql and update repo     shell: "apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29 && apt update"    - name: install python-mysqldb     apt:       name: python-mysqldb       state: present       update_cache: yes    - name: check latest version of mysql 5.7     command: bash -c "apt-cache showpkg mysql-server|grep 5.7|head -1|cut -d' ' -f1"     register: latestmysql57   - debug: msg="{{ latestmysql57.stdout }}"    - name: install mysql 57     apt:       name: mysql-server={{ latestmysql57.stdout }}       state: present       update_cache: yes    - name: update mysql root password for all root accounts     become: true     mysql_user:       name: root       host: "{{ item }}"       password: "{{ mysql_root_password }}"       login_user: root       login_password: 12345       check_implicit_admin: yes       priv: "*.*:ALL,GRANT"       state: present     with_items:       - 127.0.0.1       - ::1       - localhost    - name: Create a new database with name 'DOMAIN_NAME_DB'     mysql_db:       login_user: root       login_password: "{{ mysql_root_password }}"       name: "{{name_db}}"       state: present    - name: add user DOMAIN_NAME_USR     mysql_user:       login_user: root       login_password: "{{ mysql_root_password }}"       host: localhost       name: "{{user_db}}"       password: "{{password_user_db}}"       priv: '{{name_db}}.*:ALL,GRANT'       state: present    - name: Copy config     copy:       src: mysql/mysql.cnf       dest: /etc/mysql/mysql.conf.d/mysql.cnf    - name: restart mysql     service:       name: mysql       state: restarted

nginx_install.yml:

  - name: Install nginx     apt:       name: nginx       state: latest    - name: Copy config.     copy:       src: nginx/nginx.conf       dest: /etc/nginx/nginx.conf    - name: Copy domain_name  config     copy:       src: nginx/domain_name.conf       dest: /etc/nginx/sites-available/domain_name.conf    - name: enable site domain_name     file:       src: /etc/nginx/sites-available/domain_name.conf       dest: /etc/nginx/sites-enabled/domain_name.conf       state: link    - name: restart nginx     service:       name: nginx       state: restarted

php.yml:

- name: install php   apt: name={{ item }} update_cache=yes state=latest   with_items:   - git   - php   - php-curl   - php-gd   - php-mbstring   - php-xml   - php-xmlrpc   - php-soap   - php-intl   - php-zip  - name: copy config   copy:     src: php/php-ansible.ini     dest: /etc/php/7.3/apache2  - name: restart apache2   service:     name: apache2     state: restarted

Файл с переменными /var/ansible/LEMP/vars/main.yml:

DOMAIN_NAME: domain_name locale1: ru_RU.UTF-8 locale2: en_US.UTF-8 time_zone: Europe/Moscow User_uid: 10000 Group_GID: 10000 user_password: password mysql_root_password: password name_db: domain_name_db user_db: domain_name_usr password_user_db: password

Для тестирование переходим на удаленный сервер. Добавляем в /etc/hosts запись вида:

127.0.0.1 domain_name.com

Проверяем статусы сервисов:

systemctl status nginx apache2 mysql exim4

Если все сервисы работают, делаем запрос на сайт с помощью curl.

# curl -LI domain_name.com HTTP/1.1 302 Found Server: nginx Date: Wed, 29 Jun 2022 11:32:10 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive Keep-Alive: timeout=15 Location: http://domain_name.com/wp-admin/setup-config.php  HTTP/1.1 200 Server: nginx Date: Wed, 29 Jun 2022 11:32:10 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive Keep-Alive: timeout=15 Expires: Wed, 11 Jan 1984 05:00:00 GMT Cache-Control: no-cache, must-revalidate, max-age=0

Все работает! Далее необходимо настраивать площадку в веб интерфейсе.

Пункт 7. Итог.

Ну вот мы с вами и познакомились с Ansible и базовыми модулями, которые чаше всего используется в его работе. Разумеется, данная роль ansible не является идеальной, и создана лишь для обучения. Этого мини-курса вполне будет достаточно, чтобы понять, как работает ansible на базовом уровне.

Если у вас остались вопросы, можете задавать их в комментариях. Ставьте лайки и подписывайтесь на нас — в дальнейшем будем публиковать еще больше обучающих статьей.

Также подписывайтесь на наш telegram-канал DevOps FM.

Рекомендации для чтения:

Зашита от dos/ddos.

Обучение docker.

10 частых ошибок в настройке nginx.

Настройка LEMP сервера с нуля.


ссылка на оригинал статьи https://habr.com/ru/company/nixys/blog/674088/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *