Upload
kamil-grabowski
View
509
Download
2
Embed Size (px)
Citation preview
WRUG 10.12.2014
AnsibleAutomatyzacja zadań IT
Kamil Grabowski [email protected]
@y3tiPKO Bank Polski
Rebased Whitestream
Potrzeba automatyzacji
• Duża infrastruktura i problem skali
• Skomplikowany proces instalacji i konfiguracji środowiska
WRUG 10.12.2014
Potrzeba automatyzacji
• Duża infrastruktura i problem skali
• Skomplikowany proces instalacji i konfiguracji środowiska
• Disaster recovery
WRUG 10.12.2014
Potrzeba automatyzacji
• Duża infrastruktura i problem skali
• Skomplikowany proces instalacji i konfiguracji środowiska
• Disaster recovery
• Usługi w chmurze / OnDemand
WRUG 10.12.2014
Dlaczego Ansible?• Dokumentacja
• Agentless
• Minimum zależności:
• management: python 2.6
• node: python 2.4
WRUG 10.12.2014
Dlaczego Ansible?• Dokumentacja
• Agentless
• Minimum zależności:
• management: python 2.6
• node: python 2.4
• Filozofia
WRUG 10.12.2014
Dlaczego Ansible?• Dokumentacja
• Agentless
• Minimum zależności:
• management: python 2.6
• node: python 2.4
• Filozofia
• Bogate repozytorium modułów
WRUG 10.12.2014
Dlaczego Ansible?• Dokumentacja
• Agentless
• Minimum zależności:
• management: python 2.6
• node: python 2.4
• Filozofia
• Bogate repozytorium modułów
• Support
WRUG 10.12.2014
Warianty instalacji
WRUG 10.12.2014
Instalacja poprzez managera paczek pip
# apt-get install ansible Instalacja poprzez apt-get
Warianty instalacji
# apt-get install python-pip # pip install ansible
WRUG 10.12.2014
Instalacja poprzez managera paczek pip
# apt-get install ansible Instalacja poprzez apt-get
Warianty instalacji
# apt-get install python-pip # pip install ansible
WRUG 10.12.2014
Instalacja poprzez managera paczek pip
# apt-get install ansible Instalacja poprzez apt-get
„Hacking directory tools” dostarczony z ansible
Warianty instalacji
# apt-get install python-pip # pip install ansible
WRUG 10.12.2014
Instalacja poprzez managera paczek pip
# apt-get install ansible Instalacja poprzez apt-get
# git clone https://github.com/ansible/ansible.git # cd ansible; source hacking/env-set
„Hacking directory tools” dostarczony z ansible
Pierwszy krok - inventory$ cat hosts.ini [application] app01 ansible_ssh_host=10.0.0.11 app02 ansible_ssh_host=10.0.0.12
[database] db01 ansible_ssh_host=10.0.0.21 [all:vars] ansible_ssh_user=ubuntu
WRUG 10.12.2014
Przykład: test połączenia$ ansible -i hosts.ini -m ping all app02 | success >> { "changed": false, "ping": "pong" }
app01 | success >> { "changed": false, "ping": "pong" }
db01 | success >> { "changed": false, "ping": "pong" }
WRUG 10.12.2014
Przykład: test połączenia$ ansible -i hosts.ini -m ping all app02 | success >> { "changed": false, "ping": "pong" }
app01 | success >> { "changed": false, "ping": "pong" }
db01 | success >> { "changed": false, "ping": "pong" }
WRUG 10.12.2014
1
Przykład: test połączenia$ ansible -i hosts.ini -m ping all app02 | success >> { "changed": false, "ping": "pong" }
app01 | success >> { "changed": false, "ping": "pong" }
db01 | success >> { "changed": false, "ping": "pong" }
WRUG 10.12.2014
1 2
Przykład: test połączenia$ ansible -i hosts.ini -m ping all app02 | success >> { "changed": false, "ping": "pong" }
app01 | success >> { "changed": false, "ping": "pong" }
db01 | success >> { "changed": false, "ping": "pong" }
WRUG 10.12.2014
1 2 3
Mnogość dostępnych opcji
WRUG 10.12.2014
$ ansible -i hosts.ini -m ping app01 $ ansible -i hosts.ini -m ping application
Tylko jeden host lub grupa hostów
Mnogość dostępnych opcji
WRUG 10.12.2014
Gdy nie mamy dodanego klucza SSH na serwerze
$ ansible -i hosts.ini -m ping app01 $ ansible -i hosts.ini -m ping application
Tylko jeden host lub grupa hostów
Mnogość dostępnych opcji
$ ansible -i hosts.ini -m ping all -k
WRUG 10.12.2014
Gdy nie mamy dodanego klucza SSH na serwerze
$ ansible -i hosts.ini -m ping app01 $ ansible -i hosts.ini -m ping application
Tylko jeden host lub grupa hostów
Mnogość dostępnych opcji
$ ansible -i hosts.ini -m ping all -k
WRUG 10.12.2014
Gdy nie mamy dodanego klucza SSH na serwerze
$ ansible -i hosts.ini -m ping app01 $ ansible -i hosts.ini -m ping application
Tylko jeden host lub grupa hostów
Customowy klucz SSH
Mnogość dostępnych opcji
$ ansible -i hosts.ini -m ping all -k
WRUG 10.12.2014
Gdy nie mamy dodanego klucza SSH na serwerze
$ ansible -i hosts.ini -m ping app01 $ ansible -i hosts.ini -m ping application
Tylko jeden host lub grupa hostów
$ ansible -i hosts.ini -m ping all --private-key ~/.vagrant.d/insecure_private_key
Customowy klucz SSH
Przykład: instalacja vim$ ansible -i hosts.ini -m apt -a "name=vim state=present" all -s app02 | success >> { "changed": true, "stderr": "", "stdout": "Reading package lists...\nBuilding dependency [ciach]” }
app01 | success >> { "changed": false }
db01 | success >> { "changed": false }
WRUG 10.12.2014
Przykład: instalacja vim$ ansible -i hosts.ini -m apt -a "name=vim state=present" all -s app02 | success >> { "changed": true, "stderr": "", "stdout": "Reading package lists...\nBuilding dependency [ciach]” }
app01 | success >> { "changed": false }
db01 | success >> { "changed": false }
WRUG 10.12.2014
1
Przykład: instalacja vim$ ansible -i hosts.ini -m apt -a "name=vim state=present" all -s app02 | success >> { "changed": true, "stderr": "", "stdout": "Reading package lists...\nBuilding dependency [ciach]” }
app01 | success >> { "changed": false }
db01 | success >> { "changed": false }
WRUG 10.12.2014
1 2
Przykład: instalacja vim$ ansible -i hosts.ini -m apt -a "name=vim state=present" all -s app02 | success >> { "changed": true, "stderr": "", "stdout": "Reading package lists...\nBuilding dependency [ciach]” }
app01 | success >> { "changed": false }
db01 | success >> { "changed": false }
WRUG 10.12.2014
1 2 3
Przykład: instalacja vim$ ansible -i hosts.ini -m apt -a "name=vim state=present" all -s app02 | success >> { "changed": true, "stderr": "", "stdout": "Reading package lists...\nBuilding dependency [ciach]” }
app01 | success >> { "changed": false }
db01 | success >> { "changed": false }
WRUG 10.12.2014
1 2 3
4
Przykładowe moduły• commands: command, raw, script, shell
• cloud: azure, digital_ocean, docker, ec2, rax
WRUG 10.12.2014
Przykładowe moduły• commands: command, raw, script, shell
• cloud: azure, digital_ocean, docker, ec2, rax
• database: (mysql|postgres)_(db|user), redis
WRUG 10.12.2014
Przykładowe moduły• commands: command, raw, script, shell
• cloud: azure, digital_ocean, docker, ec2, rax
• database: (mysql|postgres)_(db|user), redis
• files: copy, fetch, file, lineinfile, template, unarchive
WRUG 10.12.2014
Przykładowe moduły• commands: command, raw, script, shell
• cloud: azure, digital_ocean, docker, ec2, rax
• database: (mysql|postgres)_(db|user), redis
• files: copy, fetch, file, lineinfile, template, unarchive
• monitoring: nagios, monit, zabbix
WRUG 10.12.2014
Przykładowe moduły• commands: command, raw, script, shell
• cloud: azure, digital_ocean, docker, ec2, rax
• database: (mysql|postgres)_(db|user), redis
• files: copy, fetch, file, lineinfile, template, unarchive
• monitoring: nagios, monit, zabbix
• packaging: apt, gem, homebrew, macports, npm, pip, yum itd.
WRUG 10.12.2014
Przykładowe moduły• commands: command, raw, script, shell
• cloud: azure, digital_ocean, docker, ec2, rax
• database: (mysql|postgres)_(db|user), redis
• files: copy, fetch, file, lineinfile, template, unarchive
• monitoring: nagios, monit, zabbix
• packaging: apt, gem, homebrew, macports, npm, pip, yum itd.
• source control: bzr, git, subversion
WRUG 10.12.2014
Przykładowe moduły• commands: command, raw, script, shell
• cloud: azure, digital_ocean, docker, ec2, rax
• database: (mysql|postgres)_(db|user), redis
• files: copy, fetch, file, lineinfile, template, unarchive
• monitoring: nagios, monit, zabbix
• packaging: apt, gem, homebrew, macports, npm, pip, yum itd.
• source control: bzr, git, subversion
• system: cron, filesystem, group, mount, service, user
WRUG 10.12.2014
Przykładowe moduły• commands: command, raw, script, shell
• cloud: azure, digital_ocean, docker, ec2, rax
• database: (mysql|postgres)_(db|user), redis
• files: copy, fetch, file, lineinfile, template, unarchive
• monitoring: nagios, monit, zabbix
• packaging: apt, gem, homebrew, macports, npm, pip, yum itd.
• source control: bzr, git, subversion
• system: cron, filesystem, group, mount, service, user
• i wiele wiele innych, plus bardzo łatwo pisać swoje moduły
WRUG 10.12.2014
Playbooks• Struktura opisująca konfigurację oraz pożądany stan hostów,
którymi zarządzamy
WRUG 10.12.2014
Playbooks• Struktura opisująca konfigurację oraz pożądany stan hostów,
którymi zarządzamy
• Odpowiednik cookbook z chef
WRUG 10.12.2014
Playbooks• Struktura opisująca konfigurację oraz pożądany stan hostów,
którymi zarządzamy
• Odpowiednik cookbook z chef
• Pliki w formacie YAML, „human-readable”
WRUG 10.12.2014
Playbooks• Struktura opisująca konfigurację oraz pożądany stan hostów,
którymi zarządzamy
• Odpowiednik cookbook z chef
• Pliki w formacie YAML, „human-readable”
• Możemy korzystać z pythonowego systemu szablonów Jinja2
WRUG 10.12.2014
Playbooks• Struktura opisująca konfigurację oraz pożądany stan hostów,
którymi zarządzamy
• Odpowiednik cookbook z chef
• Pliki w formacie YAML, „human-readable”
• Możemy korzystać z pythonowego systemu szablonów Jinja2
• Wiele sposobów na ich organizację, dzięki czemu służą w prostych oraz skomplikowanych środowiskach
WRUG 10.12.2014
Playbooks• Struktura opisująca konfigurację oraz pożądany stan hostów,
którymi zarządzamy
• Odpowiednik cookbook z chef
• Pliki w formacie YAML, „human-readable”
• Możemy korzystać z pythonowego systemu szablonów Jinja2
• Wiele sposobów na ich organizację, dzięki czemu służą w prostych oraz skomplikowanych środowiskach
• To właśnie tu możemy zobaczyć całe piękno i filozofię ansible!
WRUG 10.12.2014
Przykład: prosty playbook$ cat application.yml --- - name: Deploy application servers hosts: application sudo: yes tasks: - name: Install some packages apt: name=„{{ item }}” state=present with_items: - build-essential - vim
WRUG 10.12.2014
Przykład: prosty playbook$ ansible-playbook -i hosts.ini application.yml PLAY [Install some packages] ************************************************** GATHERING FACTS *************************************************************** ok: [app01] ok: [app02]
TASK: [Install some packages] ************************************************* ok: [app01] => (item=build-essential,vim) changed: [app02] => (item=build-essential,vim)
PLAY RECAP ******************************************************************** app01 : ok=2 changed=0 unreachable=0 failed=0 app02 : ok=2 changed=1 unreachable=0 failed=0
WRUG 10.12.2014
Przykład: prosty playbook$ ansible-playbook -i hosts.ini application.yml PLAY [Install some packages] ************************************************** GATHERING FACTS *************************************************************** ok: [app01] ok: [app02]
TASK: [Install some packages] ************************************************* ok: [app01] => (item=build-essential,vim) changed: [app02] => (item=build-essential,vim)
PLAY RECAP ******************************************************************** app01 : ok=2 changed=0 unreachable=0 failed=0 app02 : ok=2 changed=1 unreachable=0 failed=0
WRUG 10.12.2014
1
Przykład: prosty playbook$ ansible-playbook -i hosts.ini application.yml PLAY [Install some packages] ************************************************** GATHERING FACTS *************************************************************** ok: [app01] ok: [app02]
TASK: [Install some packages] ************************************************* ok: [app01] => (item=build-essential,vim) changed: [app02] => (item=build-essential,vim)
PLAY RECAP ******************************************************************** app01 : ok=2 changed=0 unreachable=0 failed=0 app02 : ok=2 changed=1 unreachable=0 failed=0
WRUG 10.12.2014
1 2
Przykład: prosty playbook$ ansible-playbook -i hosts.ini application.yml PLAY [Install some packages] ************************************************** GATHERING FACTS *************************************************************** ok: [app01] ok: [app02]
TASK: [Install some packages] ************************************************* ok: [app01] => (item=build-essential,vim) changed: [app02] => (item=build-essential,vim)
PLAY RECAP ******************************************************************** app01 : ok=2 changed=0 unreachable=0 failed=0 app02 : ok=2 changed=1 unreachable=0 failed=0
WRUG 10.12.2014
1 2
3
Przykład: prosty playbook$ ansible-playbook -i hosts.ini application.yml PLAY [Install some packages] ************************************************** GATHERING FACTS *************************************************************** ok: [app01] ok: [app02]
TASK: [Install some packages] ************************************************* ok: [app01] => (item=build-essential,vim) changed: [app02] => (item=build-essential,vim)
PLAY RECAP ******************************************************************** app01 : ok=2 changed=0 unreachable=0 failed=0 app02 : ok=2 changed=1 unreachable=0 failed=0
WRUG 10.12.2014
1 2
3
4
Przykład: prosty playbook$ ansible-playbook -i hosts.ini application.yml PLAY [Install some packages] ************************************************** GATHERING FACTS *************************************************************** ok: [app01] ok: [app02]
TASK: [Install some packages] ************************************************* ok: [app01] => (item=build-essential,vim) changed: [app02] => (item=build-essential,vim)
PLAY RECAP ******************************************************************** app01 : ok=2 changed=0 unreachable=0 failed=0 app02 : ok=2 changed=1 unreachable=0 failed=0
WRUG 10.12.2014
1 2
3
4
5
Playbook - directory layoutproduction.ini - Nasze inventory dla środowiska produkcyjnego stage.ini oraz testowego (stage)group_vars/ - Zmienne dla całych grup hostów. W naszym application przypadku dla grup application oraz database database host_vars/ - Zmienne zdefiniowane tylko dla konkretnego app01 hosta library/ - Jeśli korzystamy z własnych modułów to jest my-module/ to idealny katalog na ich umieszczenie site.yml - Nasze playbooki application.yml database.yml roles/ - Katalog, w którym będziemy przechowywać nasze chruby/ wszystkie role. Poprzez rolę możemy tu rozumieć nginx/ funkcje jakie będzie posiadał nasz serwer. our-application/ Dla przykładu serwer może mieć funkcje bazy postgresql/ danych postgresql lub serwer www nginx. ruby-install/
WRUG 10.12.2014
Playbook - directory layoutproduction.ini stage.ini group_vars/ application database host_vars/ app01 library/ my-module/ site.yml application.yml database.yml roles/ chruby/ nginx/ our-application/ postgresql/ ruby-install/
WRUG 10.12.2014
roles/ postgresql/ defaults/ main.yml files/ some_tools.tgz handlers/ main.yml library/ role-module/ meta/ main.yml tasks/ main.yml templates/ postgresql.conf.j2 vars/ main.yml
Przykład: playbook application.yml - wersja 2
$ cat application.yml --- - name: Deploy application servers hosts: application sudo: yes roles: - ruby-install - chruby - { role: nginx, server_name: example.com } - { role: our-application, sudo_user: ubuntu }
WRUG 10.12.2014
O czym jeszcze warto wspomieć?
• Variables, Loops, Conditionals, Jinja2
• Tags
• Facts Caching
WRUG 10.12.2014
O czym jeszcze warto wspomieć?
• Variables, Loops, Conditionals, Jinja2
• Tags
• Facts Caching
• Ansible Vault
WRUG 10.12.2014
O czym jeszcze warto wspomieć?
• Variables, Loops, Conditionals, Jinja2
• Tags
• Facts Caching
• Ansible Vault
• Asynchronous Actions and Polling
WRUG 10.12.2014
O czym jeszcze warto wspomieć?
• Variables, Loops, Conditionals, Jinja2
• Tags
• Facts Caching
• Ansible Vault
• Asynchronous Actions and Polling
• Rolling Update, Maximum Failure Percentage, Deletation, Run Once
WRUG 10.12.2014
O czym jeszcze warto wspomieć?
• Variables, Loops, Conditionals, Jinja2
• Tags
• Facts Caching
• Ansible Vault
• Asynchronous Actions and Polling
• Rolling Update, Maximum Failure Percentage, Deletation, Run Once
• Var Promts
WRUG 10.12.2014
O czym jeszcze warto wspomieć?
• Variables, Loops, Conditionals, Jinja2
• Tags
• Facts Caching
• Ansible Vault
• Asynchronous Actions and Polling
• Rolling Update, Maximum Failure Percentage, Deletation, Run Once
• Var Promts
• Ansible Galaxy
WRUG 10.12.2014
WRUG 10.12.2014
Dziękuję za uwagę
Kamil Grabowski [email protected]
@y3tiPKO Bank Polski
Rebased Whitestream