#1 Automatyzacja środowiska Wirtualnego przy użyciu Ansible + Vagrant

vagrant ansible logo

0.Wstęp

W dzisiejszy czasach, nieustanie coś się zmienia, co chwile pojawia się nowa wersja czegoś tam, dodatkowe funkcje, naprawione funkcje, poprawiona wydajność itd…
Lub abo po prostu szanujemy nasz własny czas i klawiaturę 🙂 zaczynamy wtedy szukać sposobu jak tu zautomatyzować kilka prostych zadań. Przygotować maszynę do testów lub nawet do szybkiego powstanie całego provisnionigu na nowo. I tu własnie wchodzą do gry takie narzędzia jak Vagrant i Ansible. Vagranta można porównać do garnca na zupe, na dać dobry grunt na interes 🙂 A samo ansible do wora składników, której efektem końcowym ma być owa zupa 🙂

0.1 Cel

Automatyczne przygotowanie systemu i usług do najnowszej odsłony wordpressa. Zakładając, że usługa www i mysql mają działać na odrębnych maszynach wirtualnych. Mają budować sie od zera( system vanilia -podstawowy pakiet)
ansible-vagrant

0.2 Wykorzystane technologie

  • Vagrant 1.9.1 -narzędzie do bardziej sprawniejszego tworzenia maszyn wirtualnych.
  • Ansbile 2.2.1.0 – narzędzie do automatyzacji wykonywanych zadań na maszynach.
  • Virualbox 5.1.14 – odpowiada za emulacje pracy komputera (wirtualizacja).
  • Nginx 1.6.2 – Serwer stron www.
  • mysql-server – Serwer bazy danych opartych o mysql
  • php5-fpm 5.6.30-0+deb8u1 (fpm-fcgi) – zmodyfikowany php – wygenerowane raz strone dla danego requestu, ładuje na stałe do pamięci RAM, dzięki czemu zwiększa się wydajność stron pisanych w php.
  • debian/jessie64 – wykorzystana czysta maszyna z bazy hasiCorp – 3.16.0-4-amd64 #1 SMP Debian 3.16.39-1 (2016-12-30) x86_64 GNU/Linux
  • Wordprees 4.7 – popularny cms do blogowania.
  • Zadania robione na maszynie – 4.9.8-1-ARCH LINUX

1. Przygotowanie i Instalacja

# Menedżer pakietów pacman -S virtualbox vagrant ansible mkdir playground && cd playground # pobieranie vmki czystego debiana vagrant box add debian/jessie64 https://atlas.hashicorp.com/debian/boxes/jessie64 --provider virtualbox

2. Konfiguracja

Na samym początku zaczniemy od przygotowania kliku pliczków potrzebnych dla vagranta, asnbile i uruchomienia usług na serwerze www i bazy danych:

Dla serwera web:

  • nginx.conf – konfiguracja serwera www.
  • default – konfiguracja strony dla nginx.
  • www.conf– konfiguracja modułu fpm dla php.
  • wp-config.php– konfiguracja dla wordpressa.

Dla serwera db:

  • my.cnf – konfiguracja serwera mysql.
  • wp.sql – polecania sql dla bazy wordpress.

Każdy z tych plików, będą kopiowane do właściwego miejsca i serwera za pomocąz skrypta w ansible-playbook.

Dla varganta i ansbil:e

  • VagrantFile – konfiguracja maszyn wirtualnych, interfejsy, pamieć itp..
  • setup-all.yml – skrypt do ansible-playbook – przygotowuje nasze maszyny do pracy
  • inventory.ini – spis maszyn wirtualnych podzielony w naszym przypadku na dwie role: [web] i [db]

2.1 Pliki do serwera web (nginx, php-fpm)

Aby przygotować do pracy serwer Nginx+ php5-fpm, musimy przynajmniej ogarnąć te trzy pliczki:

a) /etc/nginx/sites-enabled/default

W tym pliku definiujemy domyślnego VirtualHosta. Zakładam, że mamy tylko jedną stronę do obsłużenia.

server { listen 80; root /var/www/html/wordpress; index index.php server_name _; location / { try_files $uri $uri/ =404; } location ~ .php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
default

  • server { } – w tym bloku definiujemy nasz server www
  • listen – port na którym będzie nasłuchiwał serwer www
  • root – określa ścieżkę do zasobu naszej strony.
  • location / {} – w tym bloku definiujemy co ma zrobić nginx dla danego zapytania servera
  • fastcgi_pass 127.0.0.1:9000; – włączenie obsługi php-fpm dla wszystkich plików php

b) /etc/nginx/nginx.conf

Chyba standardowa konfiguracja dla każdego nginx 😛

user www-data; worker_processes 4; pid /run/nginx.pid; events { worker_connections 768; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; gzip on; gzip_disable "msie6"; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
nginx.conf

c) /etc/php5/fpm/pool.d/www.conf

Konfiguracja modułu php5-fpm.

[www] user = www-data group = www-data listen = 127.0.0.1:9000 listen.owner = www-data listen.group = www-data pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 chdir = /
www.conf

  • listen – określamy pool dla fpm na którym nasłuchuje

2.2 Plik do serwera MySql

a) /etc/mysql/my.cnf

Plik do konfiguracji serwera mysql

[client] port = 3306 socket = /var/run/mysqld/mysqld.sock [mysqld_safe] socket = /var/run/mysqld/mysqld.sock nice = 0 [mysqld] user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp lc-messages-dir = /usr/share/mysql skip-external-locking bind-address = 192.168.50.51 key_buffer = 16M max_allowed_packet = 16M thread_stack = 192K thread_cache_size = 8 myisam-recover = BACKUP query_cache_limit = 1M query_cache_size = 16M log_error = /var/log/mysql/error.log expire_logs_days = 10 max_binlog_size = 100M [mysqldump] quick quote-names max_allowed_packet = 16M [mysql] [isamchk] key_buffer = 16M !includedir /etc/mysql/conf.d/
my.cnf

  • port 3306 – port na którym serwer będzie słuchał
  • bind-address = 192.168.50.51 -adres ip na którym serwer będzie nasłuchiwał

b)wp.sql

Plik będzie dumpowany do mysql, znajdują się w nim dwa polecenia, które dodają użytkownika do bazy.

GRANT ALL ON wp_db.* to 'wp_web'@'192.168.50.40' IDENTIFIED BY 'mypassword'; FLUSH PRIVILEGES;
wp.sql

2.3 Plik do WordPressa

a) wp-config.php

W tym pliczku znajduje sie podstawowa konfiguracja potrzebna do odpalenia wordpressa.

<?php define('DB_NAME', 'wp_db'); define('DB_USER', 'wp_web'); define('DB_PASSWORD', 'mypassword'); define('DB_HOST', '192.168.50.51'); define('DB_CHARSET', 'utf8'); define('DB_COLLATE', ''); define('AUTH_KEY', 'myuniquephrase'); define('SECURE_AUTH_KEY', 'myuniquephrase'); define('LOGGED_IN_KEY', 'myuniquephrase'); define('NONCE_KEY', 'myuniquephrase'); define('AUTH_SALT', 'myuniquephrase'); define('SECURE_AUTH_SALT', 'myuniquephrase'); define('LOGGED_IN_SALT', 'myuniquephrase'); define('NONCE_SALT', 'myuniquephrase'); $table_prefix = 'wp_'; define('WP_DEBUG', false); if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/'); require_once(ABSPATH . 'wp-settings.php');
wp-config.php

  • define(‘DB_NAME’, ‘wp_db’); – nazwa bazy danych
  • define(‘DB_USER’, ‘wp_web’); – użytkownika posiadającego pełne uprawnienia do bazy danych.
  • define(‘DB_PASSWORD’, ‘mypassword’); – hasełko dla tego użtkownika
  • define(‘DB_HOST’, ‘192.168.50.51’); – adres na którym nasłuchuje serwer mysql

2.4 Konfiguracja Vagrant

a) VagrantFile

# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.ssh.insert_key=false (0..0).each do |i| config.vm.define "web#{i}" do |w| w.vm.box = "debian/jessie64" w.vm.hostname = "web#{i}" w.vm.network "public_network", bridge: "enp7s0", ip: "192.168.50.4#{i}" w.vm.provision "shell", run: "always", inline: "ip route add 192.168.11.0/24 dev eth1" w.vm.provision :shell, privileged: false do |s| ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip s.inline = <<-SHELL echo #{ssh_pub_key} >> ~/.ssh/authorized_keys sudo bash -c "echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys" SHELL end w.vm.provider "virtualbox" do |vb| vb.memory = "1024" #vb.gui = true end end end config.vm.define :db do |d| d.vm.box = "debian/jessie64" d.vm.hostname = "db" d.vm.network "public_network", bridge: "enp7s0", ip: "192.168.50.51" d.vm.provision "shell", run: "always", inline: "ip route add 192.168.11.0/24 dev eth1" d.vm.provision :shell, privileged: false do |s| ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip s.inline = <<-SHELL echo #{ssh_pub_key} >> ~/.ssh/authorized_keys sudo bash -c "echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys" SHELL end d.vm.provider "virtualbox" do |vb| vb.memory = "1024" #vb.gui = true end end end
VagrantFile
  • w.vm.box = “debian/jessie64” – nazwa vmkim, na której będziemy budować system. Jest to najnowszy, stabilny i czysty debian
  • (0..0).each do |i| …. end – pętla, która w tym przypadku, wykona się tylko raz
  • “web#{i}” – dodaje zmienną z pętli do nazwy
  • d.vm.provision “shell”, run: “always”, inline: “ip route add 192.168.11.0/24 dev eth1”
    – wykonanie polecanie na gotowej maszynie

2.5 Konfiguracja Ansible

a) inventory.ini

W tym pliczku dzielimy hosty na poszczególne role. Wykorzystujemy tutaj sztywne mapowanie nazwy hostów. Czyli każda vm musi zostać też dodana do /etc/hosts

[web] web0 [db] db
inventory.ini

web0 -> 192.168.40.40
db -> 192.168.50.51

b) setup-all.yml

--- # Dla wszystkich - hosts: all sudo: yes gather_facts: no tasks: - name: install vim apt: name=vim state="installed" update_cache=yes # Dla serwerow DB - hosts: db sudo: yes tasks: - name: install mysql server apt: name: "{{ item }}" with_items: - python-mysqldb - mysql-server - name: CREATE DATABASE wp_db mysql_db: name: wp_db state: present - name: kopiowanie wp.sql template: src=wp.sql dest=~/wp.sql - name: Restore database mysql_db: name: wp_db state: import target: ~/wp.sql - name: kopiowanie my.cnf i restart myqsl template: src=my.cnf dest=/etc/mysql/my.cnf - name: restart mysql service: name=mysql state=restarted # Dla serwerow WEB - hosts: web sudo: yes tasks: - name: install nginx apt: name=nginx state=installed - name: install php5-mysql apt: name=php5-mysql state=installed - name: install php5-fpm apt: name=php5-fpm state=installed #- name: kopiowanie php.ini #template: src=php.ini dest=/etc/php5/fpm/php.ini - name: kopiowanie www.conf template: src=www.conf dest=/etc/php5/fpm/pool.d/www.conf notify: restart php5-fpm - name: kopiowanie default template: src=default dest=/etc/nginx/sites-enabled/default - name: download wordpress and unpack unarchive: src: http://wordpress.org/latest.tar.gz dest: /var/www/html/ remote_src: True - name: kopiowanie wp-config.php template: src=wp-config.php dest=/var/www/html/wordpress/wp-config.php - name: kopiowanie nginx.conf template: src=nginx.conf dest=/etc/nginx/nginx.conf notify: restart nginx handlers: - name: restart php5-fpm service: name=php5-fpm state=restarted - name: restart nginx service: name=nginx state=restarted
setup-all.yml
  • – hosts: all
    sudo: yes
    gather_facts: no
    – operacje przeznaczone dla wszystkich hostów wykonywane prawami roota
  • tasks:

    – name: install vim
    apt: name=vim state=”installed” update_cache=yes
    – instalacja aplikacji za pomocą menadżera apt-get, przed samą instalacją, zostanie wykonanie polecenie apt-get update


  • notify: restart nginx
    handlers:
    – name: restart nginx
    service: name=nginx state=restarted
    – po poprawnej instalacji pakietu, zostanie wywołana funkcja restartu nginx
  • – name: kopiowanie my.cnf i restart myqsl
    template: src=my.cnf dest=/etc/mysql/my.cnf
    – kopiowanie pliku z miejsca gdzie został odpalony skrypt setup-all.yml w właściwe miejsce na serwerze

3. Let’s make magic – vagrant up & ansible-playbook

cat >> /etc/hosts <<EOL 192.168.50.40 web0 192.168.50.51 db EOL vagrant up ssh-keyscan web0 db >> ~/.ssh/known_hosts ansible -i ./inventory.ini all -m ping -u vagrant # jesli zielona 🙂 jedziemy dalej ansible-playbook setup-all.yml -i ./inventory.ini -u vagrant

4. Finał

vagrant ansible tty
Wordpress UP

5. GitHub

GitHub – blog1

git clone https://github.com/leszekuchacz/blog-1-Automatyzacja-rodowiska-Wirtualnego-przy-u-yciu-Ansbile-Vagrant.git blog1 cd blog1 # default configuration ip for this snnipet is for network 192.168.50.0/24 # chanege ip for your network in files: # - /etc/hosts # - VagrantFile # - setup-all.yml vagrant box add debian/jessie64 https://atlas.hashicorp.com/debian/boxes/jessie64 --provider virtualbox vagrant up cat >> /etc/hosts <<EOL 192.168.50.40 web0 192.168.50.51 db EOL ssh-keyscan web0 db >> ~/.ssh/known_hosts ansible -i ./inventory.ini all -m ping -u vagrant

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.