Provisioning d'un projet Symfony

avec Ansible

sfPot du 16/09/14

Simon C. @kos_si

Simon C.

 

Architecte WEB

Travaille chez Theodo

Adepte du LEAN

et de SCRUM

Qui suis je ?

Sommaire

 

  • Ansible
  • Son écosystème
  • Exemple d'un projet Symfony

Qu'est ce qu'Ansible ?

 

  • Outil d'automatisation de tâches
    d'administration système
  • Utilise SSH
  • Utilise Python
  • Sans agent coté serveur
  • Configuration en YAML
  • Extensible
  • Idempotent
  • Template avec Jinja2
  • Parallélisable

242 modules

 

  • Command : command, script, shell
  • Database : mongodb, mysql, postgresql, redis, riak
  • Source Control : git, github_hooks
  • System : authorized_key, cron, hostname, ping, user
  • Utilities : assert, debug, fail, include_vars, pause
  • ...
ansible webservers -m ping

Playbook

 

Configuration :

  • des hosts
  • des tâches
  • des variables

Les inventaires

 

Classement des noms de domaine par groupe

  • soit par domaine (web, db, ...)
  • soit par localisation
  • ou comme vous le voulez...
[prod]
symfony.com
symfony2.com
[webservers:children]
prod
[dbservers:children]
prod

Exemple de playbook

inventaire.yml :

[webservers]
my-website.com

playbook.yml :

- hosts: webservers
  tasks: 
     - name: install server
       action: apt pkg=apache2 state=present
       notify: apache2 restart
     - name: configure server
       action: template src=httpd.conf
       dest=/etc/apache2/httpd.conf

exécution :

ansible-playbook -i inventaire.yml playbook.yml

Exemple de playbook

playbook.yml :

- hosts: webservers
  sudo: yes
  vars_files:
    - vars/mysql.yml
  roles:
    - { role: Ansibles.mysql, tags: mysql }

mysql.yml :

mysql_databases:
  - name: "{{ symfony_mysql_name }}"
mysql_users:
  - name: "{{ symfony_mysql_user }}"
    pass: "{{ symfony_mysql_password }}"
    priv: "*.*:ALL"

Les rôles

Configuration de :

  • variable et constante
  • tâche
  • template

Choisir un rôle :

  • test avec Travis
  • documentation
  • playbook de test
  • Vagrantfile pour tester
    sur différents environnement

Configuration vagrant

 

  # 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 = "vvvv"
    ansible.tags = "config"
  end

L'écosystème

Ansible Galaxy

  • Partage de rôles
  • Notation de rôles
  • Gestion de version
  • Téléchargement en CLI
ansible-galaxy install kosssi.composer,v1.0.3

Ansible Tower

  • Dashboard
  • Gestion des équipes
  • Gestion des utilisateurs
  • Gestion de projets
  • Gestion de tâche
  • ...

Exemple d'un projet Symfony

Installation des roles

 

ansible-galaxy install -i kosssi.apache,v1.0.1 --force
ansible-galaxy install -i ANXS.mysql,v1.0.2 --force
ansible-galaxy install -i kosssi.php,v1.0.0 --force
ansible-galaxy install -i kosssi.composer,v1.0.3 --force

Création des inventaires

 

[vagrant]
symfony.dev

[webservers:children]
vagrant

[dbservers:children]
vagrant
[prod]
symfony.prod

[webservers:children]
prod

[dbservers:children]
prod

/provision/hosts/vagrant :

/provision/hosts/prod :

Création du playbook

 

- name: Provision website
  hosts: webservers
  sudo: yes
  vars_files:
    - vars/php.yml
    - vars/apache.yml
  roles:
    - { role: kosssi.php, tags: php }
    - { role: kosssi.composer, tags: composer }
    - { role: kosssi.apache, tags: apache }
    - { role: www-data, tags: www-data }

pour les webservers

Création du playbook

 

- name: Provision database
  hosts: dbservers
  sudo: yes
  vars_files:
    - vars/mysql.yml
  roles:
    - { role: Ansibles.mysql, tags: mysql }

pour les dbservers

Demo

Retour d'expérience

 

 

  • Je me suis mis à adorer le devops et à en faire un max

  • C'est un plaisir de mettre à jour mon provisioning

  • Avec quelques exemples on peut facilement apprendre à quelqu'un

  • Les devs ♥ ansible
  • Les ops un peu moins ... pour l'instant

Question ?

Merci !!!

Ansible and Symfony

By kosssi

Ansible and Symfony

  • 3,266