Ansible pour le cloud

PHP Tour Luxembourg 12/05/15

Maxime Thoonsen

@maxthoon

Ansible est un framework d'automatisation de tâches

Ansible est simple

“La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.”.

- Antoine de Saint-Exupéry

Sans agent à installer

Local

Serveur distant

Commande Ansible

Modules de bases

apt, template, shell, ...
mongodb, mysql, ...

Ecrire du Ansible

YAML

Template en jinja2 (Twig)

Un script Ansible

hosts/

roles/

vars/

playbook.yml

Playbook

---
- name: Symfony app
  hosts: all
  vars_files:
    - vars/main.yml
    - vars/fail2ban.yml
    - vars/iptables.yml
  sudo: yes
  roles:
    - common       
    - { role: ANXS.mysql, tags: mysql  } 
    - nginx-symfony
    - php
    - composer
    - nickjj.fail2ban
    - Stouts.iptables

Un script Ansible

hosts/

roles/

vars/

playbook.yml

Rôle

Rôle

roles/mysql/
          defaults/
          handlers/
          tasks/
          template/
  • Nom
  • Module

Tâche

Tâche + Condition

Handlers

roles/mysql/
          defaults/
          handlers/
          tasks/
          template/

Tâche + Handler

Les variables

hosts/

roles/

vars/

playbook.yml

Les variables

roles/mysql/
          defaults/
          handlers/
          tasks/
          template/

Les variables

Tâche + Variables

- name: Ensure PHP packages are installed
  apt: name={{ item }} state=installed
  with_items: php_packages
- name: Create mods-available directory
  file:
    path={{ php_conf_basepath }}/mods-available
    state=directory

Rôle

mysql/
      defaults/
      handlers/
      tasks/
      template/

Tâche + Template

- name: add server main conf
  template: 
    src=etc/nginx/conf.d/conf 
    dest=/etc/nginx/conf.d/main.conf
  notify: restart-nginx

Template

Le cloud ?

Modules natifs pour IAAS

Modules de gestion de VM

# Amazon Elastic Compute Cloud
# création de 3 VMs ubuntu
- ec2:
    key_name: mykey
    instance_type: t2.micro
    image: ubuntu-1204-lts
    wait: yes
    group: webserver
    count: 3
    assign_public_ip: yes

Modules de gestion de VM

# Openstack
# Assign a floating ip to the instance

- quantum_floating_ip: 
    login_username=admin 
    login_password=admin
    login_tenant_name=admin 
    network_name=external_network
    instance_name=vm1

Les serveurs

hosts/

roles/

vars/

playbook.yml

Inventaires

#groupe
[paris]
75.0.0.1
75.0.0.2

[bretagne]
22.22.22.22
29.29.29.29

#groupe de groupes
[france:children]
paris
bretagne

Variables serveur/groupe

---
#hosts/host_var/bretagne

serveur_name: prod.bzh
mysql_pwd: crepes

Ansible vault

Heartbleed

Heartbleed

- hosts: france
  sudo: yes
  tasks:
    - name: Update OpenSSL and OpenSSH (Debian)
      apt: name={{ item }} state=latest update_cache=yes
      with_items:
        - openssl
        - openssh-client
        - openssh-server

  post_tasks:
    - name: Reboot servers
      command: reboot

Ansible Tower

Ansible Tower

DevOps et Ansible 

dans le cloud

Le DevOps c'est l'amélioration continue du flux développement-production et non quelques outils spécifiques.

- Dave Roberts  

Communication

Compréhension

Amélioration continue

Embarquer toute la chaîne

Le provisioning automatique de serveurs, un bon moyen de faire du DevOps(ArchSec)

PROD

PREPROD

STAGING

LOCAL

Provisioning de serveurs

 M PROD + N PREPROD + P STAGING + Q DEV =

PROD

PREPROD

STAGING

LOCAL

Provisioning avec Ansible

Vagrantfile

# Ansible
  config.vm.provision "ansible" do |ansible|
    ansible.sudo = true
    ansible.playbook = "provision/playbook.yml"
    ansible.limit = "vagrant" # hosts group
    ansible.inventory_path = "provision/hosts/vagrant"
    ansible.verbose = "v" #Use vvvv to get more log
  end

Ansible et Docker

Gestion de l'OS du serveur

Gérer les containers

Module de base Docker

# Ensure that a data container
# with the name "mydata" exists.

- name: data container
  docker:
    name: mydata
    image: busybox
    state: present
    volumes:
    - /data

Ansible in Dockerfile

#Sécurité
FROM ubuntu

COPY ./symfony-ansible /ansible

RUN install_ansible.sh
 
RUN ansible-playbook -i "localhost," \
    -c local /ansible/provisioning/playbook.yml
    
CMD ["start.sh"]

Démarrez maintenant !

Rejoignez nous !

fansible

Feedback

  • Les devs aiment Ansible !  

  • Les sysadmins moins

  • J'adore le provisioning !

  • Ansible est facile à apprendre 

Questions ?

@maxthoon

https://slides.com/maximethoonsen