Skip to content
Snippets Groups Projects
Commit 007f6272 authored by Vincent Mazenod's avatar Vincent Mazenod
Browse files

devops

parent 97a0c0a9
No related branches found
No related tags found
No related merge requests found
Pipeline #3302 passed
content/slides/cri/images/cri.jpeg

1.05 MiB

content/slides/cri/images/devops-toolchain.png

61.8 KiB

content/slides/cri/images/devops-tools.png

453 KiB

......@@ -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)
......
<h3>1337</h3>
<h3>privacy</h3>
<ul>
<li>
<a href="privacy/jnarac.html">je n'ai rien &agrave; cacher</a>
<ul>
<li><a href="1337/http.html">http</a></li>
<li><a href="privacy/sovereignty.html">souverainet&eacute;</a></li>
<li><a href="privacy/tracking.html">tracking</a></li>
<li><a href="privacy/passwords.html">mots de passes</a></li>
<li><a href="privacy/tor.html">tor</a></li>
<li><a href="privacy/tails.html">tails</a></li>
<li><a href="privacy/crypto.html">crypto</a></li>
<li><a href="privacy/pgp.html">pgp</a></li>
<li><a href="privacy/tls.html">tls</a> / <a href="privacy/tls.html#/0/52">https</a></li>
<li><a href="privacy/TLSvsPGP.html">tls vs PGP</a></li>
<li><a href="privacy/bitcoin.html">bitcoin</a></li>
</ul>
</li>
<li><a href="privacy/surfer_couvert.html">surfer couvert (en bref)</a></li>
</ul>
<h3>1337</h3>
<ul>
<li>
Architecture
......@@ -65,35 +86,16 @@
</ul>
<h3>cri</h3>
<li><a href="cri/criprod.html">criprod</a></li>
<li><a href="cri/vault.html">vault</a></li>
<li><a href="cri/ansible.html">ansible</a></li>
<li><a href="cri/terraform.html">terraform</a></li>
<li><a href="cri/vagrant.html">vagrant</a></li>
<li><a href="cri/aws.html">aws</a></li>
<h3>privacy</h3>
<ul>
<li>
<a href="privacy/jnarac.html">je n'ai rien &agrave; cacher</a>
<ul>
<li><a href="1337/http.html">http</a></li>
<li><a href="privacy/sovereignty.html">souverainet&eacute;</a></li>
<li><a href="privacy/tracking.html">tracking</a></li>
<li><a href="privacy/passwords.html">mots de passes</a></li>
<li><a href="privacy/tor.html">tor</a></li>
<li><a href="privacy/tails.html">tails</a></li>
<li><a href="privacy/crypto.html">crypto</a></li>
<li><a href="privacy/pgp.html">pgp</a></li>
<li><a href="privacy/tls.html">tls</a> / <a href="privacy/tls.html#/0/52">https</a></li>
<li><a href="privacy/TLSvsPGP.html">tls vs PGP</a></li>
<li><a href="privacy/bitcoin.html">bitcoin</a></li>
</ul>
</li>
<li><a href="privacy/surfer_couvert.html">surfer couvert (en bref)</a></li>
<li><a href="cri/devops.html">devops</a></li>
<li><a href="cri/vagrant.html">vagrant</a></li>
<li><a href="cri/ansible.html">ansible</a></li>
<li><a href="cri/vault.html">vault</a></li>
<li><a href="cri/pve.html">pve</a></li>
<li><a href="cri/terraform.html">terraform</a></li>
<li><a href="cri/stack.html">stack</a></li>
<li><a href="cri/gitlab.html">gitlab</a></li>
<li><a href="cri/my.html">my</a></li>
<li><a href="cri/openstack.html">openstack</a></li>
<li><a href="cri/criprod.html">criprod</a></li>
</ul>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment