Florian Dambrine
I am a Freelance DevOps Engineer graduated from UTC (University of Technology of Compiègne) in 2014. I am a DevOps enthusiast embracing Cloud computing technologies to build automated infrastructure at large scale.
Florian Dambrine - Engineering Manager - @ GumGum
Florian Dambrine
Engineering Ingénieur
9+ ans d'expérience chez GumGum
Fan de Cloud et d'automatisation !
Juin 2011 Juin 2014 Février 2014
Invente le In-Image Advertising en 2007
Publicité innovante et solution de "contextual intelligence" pour les agences et les sites marchands
Verity analyzes web pages for content-level brand safety and contextual classification by applying machine learning (ML) techniques to both the text and prominent images on the web page.
Theorie Pratique
#!/bin/sh
wget -O - http://debmon.org/debmon/repo.key 2>/dev/null | apt-key add -
echo 'deb http://debmon.org/debmon debmon-jessie main' >/etc/apt/sources.list.d/debmon.list
add-apt-repository ppa:formorer/icinga
add-apt-repository ppa:formorer/icinga
apt-get update
apt-get install icinga2 vim vim-icinga2
apt-get install icinga2 vim vim-icinga2
PREFIX=~/.vim
mkdir -p $PREFIX/{syntax,ftdetect}
cp /usr/share/vim/addons/ftdetect/icinga2.vim $PREFIX/ftdetect/
cp /usr/share/vim/addons/syntax/icinga2.vim $PREFIX/syntax/
vim /etc/vim/vimrc
syntax on
:wq!
apt-get install mysql-server mysql-client
apt-get install icinga2-ido-mysql
# Select <Yes> when prompted with:
mysql -u root -p
mysql> CREATE DATABASE icinga;
GRANT SELECT, INSERT, UPDATE, DELETE, DROP, CREATE VIEW, INDEX, EXECUTE ON icinga.* TO 'icinga'@'localhost' IDENTIFIED BY 'yourpasswordhere';
mysql> quit
mysql -u root -p icinga < /usr/share/icinga2-ido-mysql/schema/mysql.sql
icinga2 feature enable ido-mysql
icinga2 feature enable command
icinga2 feature list
service icinga2 restart
usermod -a -G nagios www-data
apt-get install php5 php5-cli php-pear php5-xmlrpc php5-xsl php5-gd php5-ldap php5-mysql php5-snmp php5-intl php5-imagick apache2
apt-get install icingaweb2
icingacli setup token create
icingacli setup token show
icingacli setup config webserver apache --document-root /usr/share/icingaweb2/public
a2ensite 001-icingaweb2.conf
service apache2 restart
addgroup --system icingaweb2
usermod -a -G icingaweb2 www-data
mysql -u root -p
mysql> CREATE DATABASE icingaweb2;
GRANT SELECT, INSERT, UPDATE, DELETE, DROP, CREATE VIEW, INDEX, EXECUTE ON icingaweb2.* TO 'icingaweb2'@'localhost' IDENTIFIED BY 'passwordhere';
mysql> quit
mysql -p icingaweb2 < /usr/share/icingaweb2/etc/schema/mysql.schema.sql
service apache2 restart
Inconvénients :
Inconvénients :
Inconvénients :
Je veux de la stabilité !
Je veux du changment !
Mur des lamentations
Mes systèmes sont plus stables
Je peux déployer de nouvelles fonctionnalités
Image Science
Web Team
Data Science
Big Data
8 Ingénieurs
4 Ingénieurs
19 Ingénieurs
4 Ingénieurs
11 Ingénieurs
10.5 Ingénieurs pour 1 DevOps
250 serveurs pour 1 DevOps
$ ansible-playbook ec2-provision.yml \
--extra-vars ec2_count=<X>
$ ansible-playbook apache2.yml \
--limit webservers
Intégration continue + Facilité de déploiement =
Augmentation de la fréquence de déploiement
Moins de changements par releases
Facilités de debugging et rollback
Terraform
Ansible
22.8K Stars
7.5K Forks
12K Pull requests
Static Inventory
Dynamic Inventory
### INI file format
[insset]
10.3.134.11[0:9]
[master]
10.3.134.110
[students]
10.3.134.111
10.3.134.112
10.3.134.113
10.3.134.11[4:9]
...
{
...
"ansible_eth0": {
"active": true,
"device": "eth0",
"ipv4": {
"address": "REDACTED",
"netmask": "255.255.255.0",
"network": "REDACTED"
},
...
},
"ansible_kernel": "3.5.0-23-generic",
"ansible_lsb": {
"codename": "precise",
"description": "Ubuntu 12.04.2 LTS",
"id": "Ubuntu",
"major_release": "12",
"release": "12.04"
},
"ansible_machine": "x86_64",
...
}
Commandes Linux
Modules Ansible
apt
ln
mkdir
touch
apt
file
Codes de retour:
ok - changed - skipped - failed
---
- name: Install Nginx
apt:
name: nginx
update_cache: yes
state: present
---
- name: Create the scripts log folder
file:
state: directory
path: /var/log/scripts
owner: gumgum
group: gumgum
mode: 644
---
- name: Start an EC2 instance
local_action:
module: ec2
aws_access_key: 'AKIAXXXXXXXXX'
aws_secret_key: 'XXXXXXXXXXXXX'
key_name: 'mykeypair.pem'
instance_type: 'c3.large'
wait: yes
image: 'ami-XXXXXX'
count: 1
region: 'us-east-1'
zone: 'us-east-1b'
monitoring: yes
group: ['sshonly', 'webapp']
instance_tags:
Name: demo
Owner: 'Florian Dambrine'
volumes:
- device_name: /dev/sda1
volume_size: 30
$ ansible students -i insset -s -m apt -a "name=nginx state=latest update_cache=yes"
insset-td1 | success >> {
"changed": true,
"stderr": "",
"stdout": "Reading package lists...\nBuilding dependency tree...\nReading state......"
}
insset-td2 | success >> { ...
Exemple avec la commande ad-hoc ansible
Exemple avec la commande ansible-playbook
$ ansible-playbook -i insset nginx-play.yaml
PLAY [webserver] *************************************
TASK: [Install Nginx] ********************************
changed: [insset-td1]
changed: [insset-td2]
PLAY RECAP *******************************************
insset-td1 : ok=0 changed=1 unreachable=0 failed=0
insset-td2 : ok=0 changed=1 unreachable=0 failed=0
### nginx-play.yaml
---
- hosts: students
sudo: yes
tasks:
- name: Install Nginx
apt:
name: nginx
update_cache: yes
state: latest
### nginx-playbook.yaml
---
- name: Install Nginx on Webservers
hosts: webservers
sudo: yes
tasks:
- name: Install Nginx
apt:
name: nginx
state: latest
update_cache: yes
- name: Cleanup apps-enabled
file:
state: absent
path: /etc/nginx/sites-enabled/default
- name: Cleanup apps-available
file:
state: absent
path: /etc/nginx/sites-available/default
- name: Restart Nginx
service:
name: nginx
state: restarted
rolename/
├── defaults/ ---> Lowest priority variables.
│ └── main.yaml
├── files/ ---> Contains static files that need to be deployed on remote server.
│ └── ...
├── handlers/ ---> Contains tasks that can be triggered by a notification event.
│ └── main.yaml
├── meta/ ---> Contains dependencies between roles.
│ └── main.yaml
├── tasks/ ---> Contains your soup.
│ ├── ...
│ └── main.yaml
├── templates/ ---> Contains templates that will be fed with variables (facts, or role vars).
│ ├── ....j2
└── vars/ ---> Higher level of priority where default variables will be overiden.
├── ...
└── main.yaml
### inventories/ccm/hosts
[insset]
10.3.134.11[0:9]
[master]
10.3.134.110
[students]
10.3.134.111
10.3.134.112
10.3.134.113
10.3.134.11[4:9]
inventories/
└── ccm/
├── group_vars/
│ ├── all/
│ │ └── vars.yml
│ ├── master/
│ │ └── vars.yml
│ └── students/
│ └── vars.yml
├── hosts
└── host_vars/
└── 10.3.134.118/
└── vars.yaml
roles/what-is-my-port/defaults/main.yml: what_is_my_port: 80
ccm/group_vars/all/vars.yml: what_is_my_port: 8080
ccm/group_vars/master/vars.yml: what_is_my_port: 443
ccm/group_vars/students/vars.yml: what_is_my_port: 8081
ccm/host_vars/10.3.134.118/vars.yaml: what_is_my_port: 8082
Principales options:
--limit (-l) : Limite l'action du playbook à un groupe ou à un serveur en particulier
--extra-vars (-e) : Ajoute / Réécrit les variables en ligne de commande
--list-tasks : Liste les tâches qui seront exécutées sur les cibles
--list-hosts : Liste les cibles qui seront impactées par l'automatisation
--start-at-task : Démarre l'automatisation à un endroit donné
--step : Exécute l'automatisation pas-à-pas
--syntax-check : Vérifie la syntaxe de l'automatisation
Jonathan et Iris lancent une nouvelle association: BeerBattle. Pour leur projet, ils ont decidé de réaliser un site Web qu'ils voudraient héberger sur les serveurs de l'INSSET.
Tous deux développeurs, ils manquent de connaissances en admistration système et font appel à vous pour mettre en place leur infrastructure.
Désireux de faire évoluer leur projet dans le futur, il voudrait que l'ensemble de l'infrastructure soit automatisée afin d'envisager une migration vers le Cloud.
LoadBalancer
Webservers
BDD
(Vue par les Devs)
(Vue par les Ops)
Le DevOps apporte ses conseils aux équipes de Devs sur les bonnes pratiques de mise en production de logiciel
Le DevOps doit parfois se former sur les technologies utilisées par les Devs. Il se doit d'uniformiser les bonnes pratiques à travers les différentes équipes de Devs.
Afin d'accélérer les cycles de développement de l'application, les développeurs vous demandent de mettre en place un pipeline d'intégration continue pour leur Single Page Application (SPA).
Continuous Integration (CI):
Continuous Delivery (CD):
Continuous Deployment (CDD):
The book begins with fundamentals, like installing Ansible, setting up a basic inventory file, and basic concepts, then guides you through Ansible's many uses, including ad-hoc commands, basic and advanced playbooks, application deployments, multiple-provider server provisioning, and even Docker orchestration! Everything is explained with pertinent real-world examples, often using Vagrant-managed virtual machines.
http://principlesofchaos.org/
florian@gumgum.com
@DambrineF
By Florian Dambrine
DevOps 360° is an introduction to automation with Ansible. This project is meant for teaching automation to Master students. The idea is to spin up virtual machines, install and configure servers to run a Python (Flask) Webapp. This Webapp relies on a Mysql backend. Once the infrastructure is fully up, we will see how Ansible can help orchestrate, deploy / rollback or do blue / green deployments. Finally you will learn about writing modern CI / CD / CDD pipelines with Drone in order to Build / Test / Release and Deploy software on AWS. You can find all the git repositories used in this course matching devops-360-* here https://github.com/Lowess
I am a Freelance DevOps Engineer graduated from UTC (University of Technology of Compiègne) in 2014. I am a DevOps enthusiast embracing Cloud computing technologies to build automated infrastructure at large scale.