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)
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;
}
}
- 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/*;
}
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 = /
- 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/
- 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;
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');
- 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
- 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
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
- – 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ł
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