В этой части рассмотрю установку приложений при создании виртуальной машины. Взаимодействие с google cloud я описал в первой части статьи, в этой части рассмотрю работу c ansible, в качестве примера развернем LEMP (Linux, Nginx, MySQL, PHP) и установим Wordpress
Перейдем в директорию с нашими сценариями и в сценарий create.yml добавим следующую конструкцию:
- name: Deploy Nginx and other
hosts: new_instances
become: yes
become_method: sudo
roles:
- nginx
- php-fpm
- mysql
- wordpress
Здесь я добавил роли (задачи) которые и будут отвечать за установку и настройку приложений.
Пойдем по порядку:
- Nginx
Создадим структуру директорий и файлов для роли Nginx с помощью утилиты ansible-galaxy:
ansible-galaxy init nginx
Собственно, в данный момент, нам необходимы только три директории - handlers, tasks и templates. И так для начала создадим обработчик. Для чего в nginx/handlers/main.yml (все обработчики для текущей задачи описываются здесь) добавим:
- name: restart nginx
service: name=nginx state=restarted enabled=yes
sudo: yes
Пример использования будет ниже.
Переходим в nginx/templates/ и создаем файл default со следующим содержимым:
server {
listen 80;
root /var/www/{{ domain }}/wordpress;
index index.php;
gzip on;
gzip_comp_level 9;
gzip_min_length 512;
gzip_buffers 8 64k;
gzip_types text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;
gzip_proxied any;
server_name {{ domain }};
location ~ /\. {
deny all;
}
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
}
Это и будет конфигурационный файл для нашего сайта. И последний этап - это создание самой задачи - nginx/tasks/main.yml
---
# tasks file for nginx
- name: Update apt cache
apt: update_cache=yes cache_valid_time=3600
sudo: yes
#Устанавливаем необходимые пакеты приложений
- name: Install required software
apt: name={{ item }} state=present
sudo: yes
with_items:
- nginx
- python-mysqldb
#Заменяем конфигурационный файл и рестартуем nginx используя обработчик
- name: Replace nginx default conf
template: src=default dest=/etc/nginx/sites-available/default
notify:
- restart nginx
- PHP-FPM
ansible-galaxy init php-fpm
roles/php-fpm/tasks/main.yml
---
# tasks file for php-fpm
- name: Update apt cache
apt: update_cache=yes cache_valid_time=3600
sudo: yes
- name: Install required software
apt: name={{ item }} state=present
sudo: yes
with_items:
- php5
- php5-mcrypt
- php5-fpm
- php5-mysqlnd
- php5-gd
Я использовал настройки php по умолчанию, поэтому в правилах ограничился только установкой пакетов
- MySQL
ansible-galaxy init mysql
Здесь мы используем новый файл roles/mysql/defaults/main.yml , в нем содержатся переменные и их значения используемые в роли.
---
# defaults file for mysql
wp_mysql_db: wordpress
wp_mysql_user: wordpress
Это имя БД и пользователя для WordPress
roles/mysql/tasks/main.yml
---
# tasks file for mysql
- name: Update apt cache
apt: update_cache=yes cache_valid_time=3600
sudo: yes
- name: Install required software
apt: name={{ item }} state=present
sudo: yes
with_items:
- mysql-server
- name: Create mysql database
mysql_db: name={{ wp_mysql_db }} state=present
- name: Create mysql user
mysql_user:
name={{ wp_mysql_user }}
password="{{ lookup('password', 'passwordfile length=15') }}"
priv=*.*:ALL
Устанавливаем Mysql, создаем базу и пользователя, используя переменные определенные в defaults. Немного задержу ваше внимание на создании пароля для пользователя, используется команда lookup, если в нашей директории отсутствует файл passwordfile со значением пароля, он будет сгенерирован, что собственно, нам и надо.
- И последний этап - создание задачи wordpress
roles/wordpress/handlers/main.yml
- name: restart nginx
service: name=nginx state=restarted enabled=yes
sudo: yes
roles/wordpress/tasks/main.yml
---
# tasks file for wordpress
- name: Download WordPress
get_url:
url=https://wordpress.org/latest.tar.gz
dest=/tmp/wordpress.tar.gz
validate_certs=no
sudo: yes
- name: Creates directory
file: path=/var/www/{{ domain }} state=directory
- name: Extract WordPress
unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/{{ domain }}/ copy=no
sudo: yes
- name: Copy sample config file
command: mv /var/www/{{ domain }}/wordpress/wp-config-sample.php /var/www/{{ domain }}/wordpress/wp-config.php creates=/var/www/{{ domain }}/wordpress/wp-config.php
sudo: yes
- name: Update WordPress config file
lineinfile:
dest=/var/www/{{ domain }}/wordpress/wp-config.php
regexp="{{ item.regexp }}"
line="{{ item.line }}"
with_items:
- {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"}
- {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"}
- {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{lookup('password', 'passwordfile')}}');"}
sudo: yes
notify:
- restart nginx
Здесь мы скачиваем архив wordpress, распаковываем его в нашу, только, что созданную директорию и создаем конфигурационный файл на базе образца - wp-config-sample.php, где прописываем данные нашего подключения к базе используемые в правиле mysql. И в заключении - рестартуем nginx.
Теперь можно создать нашу виртуальную машину с wp:
{"preview_thumbnail":"/sites/default/files/styles/video_embed_wysiwyg_preview/public/video_thumbnails/zGddA87DlL8.jpg?itok=2YtSxNtG","video_url":"https://youtu.be/zGddA87DlL8","settings":{"responsive":1,"width":"854","height":"480","autoplay":0},"settings_summary":["Embedded Video (Адаптивный)."]}
Создание виртуальной машины заняло у нас всего 9 минут.
Открываем WordPress и завершаем установку:
На этом можно и закончить.
Все файлы сценария находятся в рипозитории на github - https://github.com/tuxophone/ansible-google-cloud-wordpress
- Войдите или зарегистрируйтесь, чтобы оставлять комментарии