Ansible и Google Cloud (часть 2)

ansible google

В этой части рассмотрю установку приложений при создании виртуальной машины. Взаимодействие с 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 и завершаем установку:
 

setup wp

На этом можно и закончить. 

Все файлы сценария находятся в рипозитории на github - https://github.com/tuxophone/ansible-google-cloud-wordpress