Proč Ansible? – Adhoc příkazy – Inventář



Proč Ansible? – Adhoc příkazy – Inventář

0 1


ansible-talk

Slajdy k výstupu o devops nástroji Ansible na listopadových Tkalcích na webu

On Github msgre / ansible-talk

Tkalci na webuMichal Valoušek@msgrehttps://github.com/msgre/ansible-talk

Proč Ansible?

Jednoduchost Idempotency

Architektura Chefa

Architektura Ansible

K čemu Ansible?

  • Server provisioning
  • Server orchestration
  • Application deployment

Instalace

Vagrant

    $ vagrant up control
    $ vagrant up remote1
                    

Vagrantfile

Prověrka

    $ vagrant ssh control

    vagrant@control:~$ ssh vagrant@remote1.vbox
                    

Instalace

    $ vagrant ssh control

    vagrant@control:~$ sudo apt-get install software-properties-common
    vagrant@control:~$ sudo apt-add-repository -y ppa:ansible/ansible
    vagrant@control:~$ sudo apt-get update
    vagrant@control:~$ sudo apt-get install -y ansible
                    

Ansible poprvé

    $ vagrant ssh control

    vagrant@control:~$ sudo rm /etc/ansible/hosts
    vagrant@control:~$ sudo ln -s /vagrant/hosts /etc/ansible/

    vagrant@control:~$ ping remote1.vbox
    vagrant@control:~$ ansible remote1.vbox -m ping

    vagrant@control:~$ hostname
    vagrant@control:~$ ansible remote1.vbox -m shell -a "hostname"
                    

Adhoc

Adhoc příkazy

ansible <pattern> -m <module> -a <arguments>

        ansible remote1.vbox -m ping
        ansible remote1.vbox -m shell -a "hostname"
                        

Adhoc příkazy

  • Operace nad filesystémem
  • Správa balíčků
  • Správa uživatelů
  • Ovládání služeb
  • Informace o mašinách

Operace nad filesystémem

 ansible prague -m copy -a "src=/etc/hosts dest=/tmp/hosts"
 ansible prague -m file -a "dest=/path/to/c mode=755 state=directory"
                        

Správa balíčků

 ansible webservers -m apt -a "name=nginx state=present"
                        

Správa uživatelů

 ansible all -m user -a "name=karel password=<crypted password>"
 ansible all -m user -a "name=toncin state=absent"
                        

Ovládání služeb

 ansible webservers -m service -a "name=httpd state=restarted"
                        

Informace o mašinách

 ansible all -m setup
                        

Zkouška

Co udělá následující příkaz?



         ansible remote1.vbox -m apt -a "name=nginx state=present"


                    

Parametry adhoc příkazů

 # prihlasi se na masinu jako uzivatel "username"
 -u username

 # prikazy na nodu bude provadet pres sudo
 --sudo

 # prikazy na nodu bude provadet pres sudo jako uzivatel "bohous"
 -U bohous

 # kdyz se neco kazi
 -v, -vvv, -vvvv
                    

Patterny

ansible <pattern> -m <module> -a <arguments>

Inventář

/etc/ansible/hosts

    vagrant@control:~$ sudo rm /etc/ansible/hosts
    vagrant@control:~$ sudo ln -s /vagrant/hosts /etc/ansible/
                    

Inventář

 remote1.vbox ansible_ssh_host=172.16.1.21
 remote2.vbox ansible_ssh_host=172.16.1.22
 remote3.vbox ansible_ssh_host=172.16.1.23
                        

Skupiny v inventáři

 mail.example.com

 [webservers]
 foo.example.com
 bar.example.com

 [dbservers]
 one.example.com
 two.example.com
 three.example.com
                        

Proměnné v inventáři

 [atlanta]
 host1
 host2

 [atlanta:vars]
 ntp_server=ntp.atlanta.example.com
 proxy=proxy.atlanta.example.com
                        

Skupiny skupin

 [mezric]
 host1
 host2

 [vsetin]
 host2
 host3

 [valachy:children]
 mezric
 vsetin
                        

Dynamické inventáře

Zpět k patternům

Příklady patternů

 # zacileni vsech stroju
 ansible all -m ping

 # zacileni stroju ve skupine A nebo B (OR, sjednoceni)
 ansible webservers:dbservers -m ping

 # zacileni webservers ale bez phoenix (NOT)
 ansible webservers:!phoenix -m ping

 # zacileni webservers a zaroven staging (AND, prunik)
 ansible webservers:&staging -m ping

 # brutus kombinace
 ansible webservers:dbservers:&staging:!phoenix -m ping
                    

Moduly

ansible <pattern> -m <module> -a <arguments>

Více než 250 modulů

Index v oficiální dokumentaci

Příklady ze slajdů

Přestávka

(pokud už nebyla)

Playbooky

Playbooky

 ---
 - hosts: remote1.vbox
   sudo: true
   vars:
     static_dir: /var/static/

   tasks:
   - name: Install Nginx
     apt: pkg=nginx state=present

   - name: Prepare directory for static content
     file: path={{static_dir}} state=directory

   # ...
                            

Zápis v YAML formátu

Více playů v playbooku

 ---
 - hosts: remote1.vbox
   sudo: true
   tasks:
   - name: Install Nginx
     apt: pkg=nginx state=present


 - hosts: remote2.vbox
   sudo: true
   tasks:
   - name: Install Vim
     apt: pkg=vim state=present
                            

Spouštění playbooku

    vagrant@control:~$ ansible-playbook nginx1.yml
                        

Ukázka

Pokročilejší konstrukce

Šablony

Šablona template/foo.cfg.j2 (syntaxe Jinja2):

 My amp goes to {{ max_amp_value }}
                        

Vygenerování šablony v playi:

 template: src=foo.cfg.j2 dest=/etc/kangaroo/foo.cfg
                        

Podmíněné tasky

 - name: "shutdown Debian flavored systems"
   command: /sbin/shutdown -t now
   when: ansible_os_family == "Debian"
                        

Smyčky

 - name: add several users
   user: name={{ item }} state=present groups=wheel
   with_items:
   - testuser1
   - testuser2
                        

Handlery

 tasks:
 - name: ensure apache is at the latest version
   yum: pkg=httpd state=latest

 - name: write the apache config file
   template: src=/srv/httpd.j2 dest=/etc/httpd.conf
   notify:
   - restart apache

 # ...

 handlers:
 - name: restart apache
   service: name=httpd state=restarted
                        

Includes

 tasks:
 - include: tasks/foo.yml
 - include: tasks/bar.yml var1=1 var2=3
                        

Tagování tasků

 tasks:
 - yum: name={{item}} state=installed
   with_items:
   - httpd
   - memcached
   tags:
   - packages
                        
 $ ansible-playbook example.yml --tags "configuration,packages"
                        

Vypnutí gather_facts

 ---
 - name: Init provisioning infrastructure
   hosts: 127.0.0.1
   connection: local
   gather_facts: no
                        

Čekačky

 - name: Wait for port 8000
   wait_for: port=8000 delay=10
                        

Ušpiňte si ruce!

Ansible examples

Role

Adresářová struktura

 production                # inventory file for production servers
 stage                     # inventory file for stage environment

 group_vars/
    group1                 # here we assign variables to particular groups
 host_vars/
    hostname1              # if systems need specific variables, put them here

 site.yml                  # master playbook

 roles/
     common/               # this hierarchy represents a "role"
         tasks/            #
         handlers/         #
         templates/        # files for use with the template resource
         files/            #
         vars/             #
         defaults/         #
         meta/             #
     webtier/              # same kind of structure as "common" was above, done for the webtier role
     monitoring/           # ""
                    

Directory layout

Používání rolí v playbooku

 ---
 - hosts: webservers
   roles:
   - common
   - webservers
                    

Díky za pozornost