Commit 007f6272 authored by Vincent Mazenod's avatar Vincent Mazenod
Browse files

devops

parent 97a0c0a9
......@@ -22,23 +22,28 @@
* héritage
* réutilisabilité
* parallélisation
* automatisation
#### toute intervention manuelle sur un système est une faute ...
## ... GRAVE!
## ansible
* écrit en python
* python 2 par défaut
* marche bien en python 3
* marche bien en python 3 <3
* virtualenv
* [ansible docs](https://docs.ansible.com/)
* [<i class="fa fa-book" aria-hidden="true"></i> ansible](https://docs.ansible.com/)
## ansible
* prérequis
* sur la machine pilote (mgmt node)
* ansible
* ansible (donc python)
* sur le(s) noeud(s)
* une connextion ssh ou PowerShell
* python
......@@ -51,36 +56,53 @@
## terminologie
* **mgmt node** (machine pilote) machine surlaquelle ansible est installé et responsable de la configuration de toutes les machines gérées.
* **inventory** (inventaire) fichier contenant les ip de tous les serveurs à configurer
* **playbook** gère la configuration à déployer sur chaque serveur
* **task** fichier où sont définies les actions réalisées par le playbook
* **mgmt node** (machine pilote)
* machine sur laquelle ansible est installé
* pilote la configuration de toutes les machines de l'inventaire
* **inventory** (inventaire)
* fichier contenant les ip ou les noms de domaine de toutes les machines à configurer
* **playbook**
* gère la configuration à déployer sur chaque machine
* **task**
* fichier où sont définies les actions réalisées par le playbook
## terminologie
* **module** actions plus ou moins complexe utilisables à partir des **tasks**. ansible possède de [nombreux modules natifs](https://docs.ansible.com/ansible/latest/modules/modules_by_category.html). Il est possible d'écrire ses propres modules.
* **role** permet d'organiser les playbooks en parties claires et réutilisables
* **module**
* actions plus ou moins complexes, utilisables à partir des **tasks**
* ansible possède de nombreux [<i class="fa fa-book" aria-hidden="true"></i> modules natifs](https://docs.ansible.com/ansible/latest/modules/modules_by_category.html)
* il est possible d'écrire ses propres modules.
* **role**
* permet d'organiser les playbooks en parties claires et réutilisables
## terminologie
* **play** est l'exécution d'un playbook sur un serveur
* **facts** information collectée par ansible sur le système du serveur à configurer
* **handlers** similaire aux **tasks** mais appelable à partir d'une **task** (redémarrage de service par exemple)
* **play**
* est l'exécution d'un playbook sur une machine
* **facts**
* information collectée par ansible sur le système d'une machine à configurer
* **handlers**
* similaire aux **tasks** mais appelable à partir d'une **task**
* redémarrage de service par exemple
## inventory
* fichier texte au format *ini*
* organiser par groupes
* [inventory docs](https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html)
* fixer des configurations
* pour tous / par groupe / par machine
* déclarer des variables
* pour tous / par groupe / par machine
* [<i class="fa fa-book" aria-hidden="true"></i> inventory](https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html)
```ini
[ovh]
duncan
ispconfig-duncan
gitlab-runner-duncan
[criprod]
pvecriprod2.isima.fr
py.criprod.isima.fr
gitlab-runner1.criprod.isima.fr
[all:vars]
environment = production
......@@ -94,106 +116,311 @@ ansible_user = limosadm
* utilisez ~/.ssh/config
```
Host duncan
Host pvecriprod2.isima.fr
User limosadm
IdentityFile ~/.ssh/keys/limosadm
Hostname duncan.isima.fr
Host ispconfig-duncan
Host py.criprod.isima.fr
User limosadm
Hostname 10.10.100.2
IdentityFile ~/.ssh/keys/limosadm
ProxyCommand ssh duncan -W %h:%p
ProxyCommand ssh pvecriprod2.isima.fr -W %h:%p
```
## ansible / ad-hoc command
## ad-hoc command
```
$ ansible all --inventory-file=inventory.ini --module-name ping
$ ansible ovh -a "/usr/bin/uptime"
duncan | CHANGED | rc=0 >>
18:15:42 up 16 days, 43 min, 1 user, load average: 0,10, 0,10, 0,03
pvecriprod2.isima.fr | SUCCESS => {
"changed": false,
"ping": "pong"
}
py.criprod.isima.fr | SUCCESS => {
"changed": false,
"ping": "pong"
}
gitlab-runner1.criprod.isima.fr | SUCCESS => {
"changed": false,
"ping": "pong"
}
```
```
$ ansible criprod -a "/usr/bin/uptime"
gitlab-runner-duncan | CHANGED | rc=0 >>
18:15:45 up 15 days, 1:00, 1 user, load average: 0.06, 0.03, 0.01
pvecriprod2.isima.fr | CHANGED | rc=0 >>
16:18:08 up 41 days, 23:11, 3 users, load average: 0.63, 0.18, 0.10
ispconfig-duncan | CHANGED | rc=0 >>
18:15:48 up 15 days, 1:00, 1 user, load average: 0.02, 0.02, 0.00
py.criprod.isima.fr | CHANGED | rc=0 >>
15:18:15 up 1 day, 21:51, 1 user, load average: 0.13, 0.03, 0.01
gitlab-runner1.criprod.isima.fr | CHANGED | rc=0 >>
15:18:15 up 1 day, 22:14, 1 user, load average: 0.00, 0.00, 0.00
```
## ansible / ad-hoc command
## ad-hoc command
* [<i class="fa fa-book" aria-hidden="true"></i> ad-hoc command](https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html)
* [Parallelism and Shell Commands](https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html#parallelism-and-shell-commands)
* [File Transfer](https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html#file-transfer)
* [Managing Packages](https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html#managing-packages)
* [Users and Groups](https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html#users-and-groups)
* [Deploying From Source Control](https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html#deploying-from-source-control)
* [Managing Services](https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html#managing-services)
* [Time Limited Background Operations](https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html#time-limited-background-operations)
* [Gathering Facts](https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html#gathering-facts)
## playbook
[<i class="fa fa-book" aria-hidden="true"></i> playbooks](https://docs.ansible.com/ansible/latest/user_guide/playbooks.html)
my-playbook.yml
```yaml
- name: my-playbook # ce que vous voulez
hosts: criprod # ou all
# ou n'importe quel nom de machine
# ou n'importe quel nom de groupe
remote_user: limosadm # prioritaire sur ansible_user de l'inventaire
roles:
* [docs ad-hoc command](https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html)
* shell
* packages
* users / groups
* déploiement (git)
* services
- role: debug # le rôle debug sera exécuté par le playbook
tags: debug # le tag debug sera ajouté à toutes les tâches du role debug
my-variable: "pipo" # il ya d'autres endroit où mettre les variables
# à suivre ...
- role: vault-cli # le rôle vault-cli sera exécuté par le playbook
tags: vault # le tag vault sera ajouté à toutes les tâches du role vault-cli
```
## playbook
```shell
$ ansible-playbook my-playbook.yml
```
ansible-playbook ansible/playbooks/ovh/duncan.yml
exécute le playbook sur toutes les machines de l'inventaire
```shell
$ ansible-playbook my-playbook.yml --check --diff
```
* `--check` simule les tâches à effectuer sans les effectuer (dry-run)
* `--diff` indique ce qui change
* `-v`, `-vv`, `-vvv`, `-vvvv` pour la verbosité
* `--list-tags` liste tous les tags disponibles dans le playbook
* `--tags debug` n'exécute que les tâches du playbook ayant un tag `debug`
* `--skip-tags` exécute toutes les tâches du playbook sauf celles ayant un tag `debug`
* `always` tag spécial exécuté à tous les coups
`--check`
[docs playbooks](https://docs.ansible.com/ansible/latest/user_guide/playbooks.html)
simule les tâches à effectuer sans les effectuer (dry-run)
`--diff`
## variable
indique ce qui change
* pas de `-` pas de `.` pas de nuémrique pure dans les noms de variables
* via la ligne de commande
* dans les rôles
* default
* dans l'inventaire
* `group_vars`, `host_vars`
* extra vars (gagne toujours à la précédence)
* [héritage des variables](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable)
```shell
$ ansible-playbook my-playbook.yml -vvv
```
`-v`, `-vv`, `-vvv`, `-vvvv`
## variable & secret
pour la verbosité
## playbook
```shell
$ ansible-playbook my-playbook.yml --list-tags
```
liste tous les tags disponibles dans le playbook
```shell
$ ansible-playbook my-playbook.yml --tags debug
```
n'exécute que les tâches du playbook ayant un tag `debug`
```shell
$ ansible-playbook my-playbook.yml --skip-tags debug
```
exécute toutes les tâches du playbook sauf celles ayant un tag `debug`
```shell
$ ansible-playbook my-playbook.yml --limit=py.isima.fr
```
exécute toutes les tâches du playbook sur py.isima.fr uniquement
## variables
* nommage
* pas de `-` pas de `.`
* pas de numérique pure
* affectation
* [<i class="fa fa-book" aria-hidden="true"></i> inventaire](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#defining-variables-in-inventory)
* [<i class="fa fa-book" aria-hidden="true"></i> `group_vars`, `host_vars`, ou `inventaire.ini`](https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#hosts-and-groups)
* [<i class="fa fa-book" aria-hidden="true"></i> playbook](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#defining-variables-in-a-playbook)
* role
* [<i class="fa fa-book" aria-hidden="true"></i> `default`](https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html#role-default-variables)
* [<i class="fa fa-book" aria-hidden="true"></i> ligne de commande](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#passing-variables-on-the-command-line)
#### [précédence des variables](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable)
## jinja
[<i class="fa fa-book" aria-hidden="true"></i> templating](https://docs.ansible.com/ansible-container/container_yml/template.html)
group_vars/all.yml
```yaml
my-role: my-awesome-role
```
playbook.yml
```yaml
roles:
- role: "{{ my-role }}"
```
utilisable partout (playbook, role, tasks, template)
## filters
* from env ou Vault
* acces dynamique
* `ansible-vault` nous on utilise vault by HashiCorp
[<i class="fa fa-book" aria-hidden="true"></i> filters](https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html)
```yaml
"{{ item.path[:4] | replace('/', '-') }}"
```
* renvoie un path
* sans les 4 derniers caractères
* avec les `/` remplacés par des `-`
## lookup
[<i class="fa fa-book" aria-hidden="true"></i> lookup](https://docs.ansible.com/ansible/latest/plugins/lookup.html)
```yaml
vars:
file_contents: "{{lookup('file', 'path/to/file.txt')}}"
```
[<i class="fa fa-book" aria-hidden="true"></i> lookup list](https://docs.ansible.com/ansible/latest/plugins/lookup.html#plugin-list)
[<i class="fa fa-book" aria-hidden="true"></i> callback](https://docs.ansible.com/ansible/latest/plugins/callback.html)
## variable & secret
* [var_prompts](https://docs.ansible.com/ansible/latest/user_guide/playbooks_prompts.html)
* ceux là devraient être dans un keepass
* gitlab
* vault
```yaml
- debug:
msg: "{{ lookup('env','PVE_NODE') }}"
```
lit une valeur à partir d'une variable d'environement
```yaml
- debug:
msg: "{{ lookup('hashi_vault', 'secret=secret/hi:value token=xxx url=http://myvault')}}"
```
lit une valeur à partir Vault (<strike>`ansible-vault`</strike>)
```yaml
vars_prompt:
- name: "name"
prompt: "what is your name?"
```
les [<i class="fa fa-book" aria-hidden="true"></i> var_prompts](https://docs.ansible.com/ansible/latest/user_guide/playbooks_prompts.html)
permettent de lire les variables à partir de l'entrée standard.
## task
[<i class="fa fa-book" aria-hidden="true"></i> debug](https://docs.ansible.com/ansible/latest/modules/debug_module.html)
```yaml
- debug:
msg: "System {{ inventory_hostname }} has uuid {{ ansible_product_uuid }}"
```
* [<i class="fa fa-book" aria-hidden="true"></i> raw](https://docs.ansible.com/ansible/latest/modules/raw_module.html)
* n'utilise que ssh et pas python
* permet d'installer python
* [<i class="fa fa-book" aria-hidden="true"></i> command](https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module)
* [<i class="fa fa-book" aria-hidden="true"></i> shell](https://docs.ansible.com/ansible/latest/modules/shell_module.html)
* comme **command** mais au travers d'un shell
```yaml
- shell: somescript.sh >> somelog.txt
args:
chdir: somedir/
creates: somelog.txt
```
## task
## task / basic
[<i class="fa fa-book" aria-hidden="true"></i> register](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#registering-variables)
* [debug](https://docs.ansible.com/ansible/latest/modules/debug_module.html)
* [raw](https://docs.ansible.com/ansible/latest/modules/raw_module.html)
* [command](https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module)
* [shell](https://docs.ansible.com/ansible/latest/modules/shell_module.html)
```yaml
shell: /usr/bin/foo
register: foo_result
ignore_errors: True
```
[<i class="fa fa-gitlab" aria-hidden="true"></i> register dans une liste](https://gitlab.isima.fr/cri/ansible-playbook-vault/blob/master/tasks/initialize.yml#L17)
[<i class="fa fa-book" aria-hidden="true"></i> loop](https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html)
```yaml
- user:
name: "{{ item }}"
state: present
loop:
- testuser1
- testuser2
```
* marche avec
* n'importe quelle variable itérable
* [fileglob](https://docs.ansible.com/ansible/latest/plugins/lookup/fileglob.html) - list files matching a pattern
* [filetree](https://docs.ansible.com/ansible/latest/plugins/lookup/filetree.html) - recursively match all files in a directory tree
* ...
## task
[<i class="fa fa-book" aria-hidden="true"></i> when](https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html)
[<i class="fa fa-book" aria-hidden="true"></i> conditions](https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html)
```yaml
- shell: echo "only on Red Hat 6, derivatives, and later"
when: ansible_facts['os_family'] == "RedHat" and ansible_facts['lsb']['major_release']|int >= 6
```
[<i class="fa fa-book" aria-hidden="true"></i> set_fact](https://docs.ansible.com/ansible/latest/modules/set_fact_module.html)
pre_task
[<i class="fa fa-gitlab" aria-hidden="true"></i> exemple permettant de réorganiser les variables](https://gitlab.isima.fr/cri/stack/blob/master/ansible/pre-tasks/set-pve-vars.yml)
## task / basic
* register
* loop
* set_fact
* pre_task
* when
* tags
## tags
* `always`
* tag spécial exécuté à tous les coups
* tags au niveau tâches
* tags au niveau roles
## modules
......@@ -201,7 +428,7 @@ ansible-playbook ansible/playbooks/ovh/duncan.yml
* file
* infile
* copy
* template
* [<i class="fa fa-book" aria-hidden="true"></i> template](https://docs.ansible.com/ansible/latest/modules/template_module.html)
* package
* stat
* get_url
......@@ -209,18 +436,18 @@ ansible-playbook ansible/playbooks/ovh/duncan.yml
* user
* systemd
* pip
* pexpect (require pexcpect)
* pexpect (require pexpect)
* https://docs.ansible.com/ansible/latest/modules/template_module.html
## roles
* [<i class="fa fa-github" aria-hidden="true"></i> bau-sec/ansible-openvpn-hardened](https://github.com/bau-sec/ansible-openvpn-hardened)
## remote roles
## ansible.cfg
### Récupérer les roles nécessaires
## remote roles
* mettre à jour `requirements.yml` avec les rôles nécessaires
......@@ -236,20 +463,15 @@ ansible-galaxy install -f -r requirements.yml
en affectant le path dans le fichier requirements.yml au niveau du role distant
## plugins
* callback
* filter
* lookup
* module_utils
## skeleton
* https://github.com/mrjk/ansible-skel
```
ansible-galaxy init --role-skeleton /path/to/stack/ansible/roles/skeletons/role-with-vagrant gitlab
```
* [<i class="fa fa-github" aria-hidden="true"></i> mrjk/ansible-skel](https://github.com/mrjk/ansible-skel)
## ansible.cfg
## extend
* https://docs.ansible.com/ansible/latest/dev_guide/developing_plugins.html
* https://docs.ansible.com/ansible/latest/dev_guide/developing_modules.html
# DevOps
https://en.wikipedia.org/wiki/DevOps
![DevOps](images/devops-toolchain.png "DevOps")
https://12factor.net/
https://twitter.com/waxzce
## Pourquoi?
* unifier
* développement logiciel (dev)
* administration des infrastructures (ops)
* automatiser (automation)
* suivre (monitoring)
* tester: automatiquement
* accélérer: cycle courts à prioriser
* déployer: automatiquement & souvent!
## De nombreux outils
![DevOps tools](images/devops-tools.png "DevOps tools")
## contexte ISIMA / LIMOS
![team cri](images/cri.jpeg "team cri")
* ambiance tendue entre dev et ops !
* on cherche à
* autonomiser les dev et les users en général
* automatiser la gestion de nos services
## les outils du dialogue
* [vagrant](vagrant.html)
* [ansible](ansible.html)
* [vault](vault.html)
* [proxmox](pve.html)
* [terraform](terraform.html)
* [stack](stack.html)
* [gitlab](gitlab.html)
## See also
* [<i class="fa fa-wikipedia"></i> DevOps](https://en.wikipedia.org/wiki/DevOps)
* [12 factor](https://12factor.net/)
* [@waxzce](https://twitter.com/waxzce)
......@@ -19,7 +19,7 @@
## vagrant
* Il peut être considéré comme un wrapper d'hyperviseur
* il peut être considéré comme un wrapper d'hyperviseur
* VirtualBox
* libvirt
* VMware
......@@ -70,12 +70,12 @@ Vagrant.configure("2") do |config|
end
```
Beaucoup de commentaires ... laisser vous guider
beaucoup de commentaires ... laisser vous guider
## Box
* Machines virtuelles préconfigurées (templates)
* machines virtuelles préconfigurées (templates)
* [vagrant cloud](https://app.vagrantup.com/boxes/search)
* [vagrantbox.es](https://www.vagrantbox.es/)
* mis en cache
......@@ -240,7 +240,7 @@ end
## conclusion
**laissez un petit Vagrantfile dans vos playbooks [ansible](ansible.html) est toujours une bonne idée!**
**laissez un `Vagrantfile` dans vos roles [ansible](ansible.html) est toujours une bonne idée!**
* [<i class="fa fa-gitlab"></i> cri/ansible-playbook-vault](https://gitlab.isima.fr/cri/ansible-playbook-vault)
......
......@@ -167,6 +167,7 @@ Stocker le secret directement dans hashicorp vault
$ vault kv put cri/tokens root=$(openssl rand -base64 25)
```
## SEE ALSO
* [cri/ansible-playbook-vault](https://gitlab.isima.fr/cri/ansible-playbook-vault)
......