Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • vimazeno/blog.limos.fr
  • matrossevi/blog.limos.fr
  • borlonjo/blog.limos.fr
3 results
Show changes
Showing
with 1564 additions and 0 deletions
content/slides/cri/images/devops-toolchain.png

61.8 KiB

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

453 KiB

content/slides/cri/images/gitlab.png

3.6 KiB

content/slides/cri/images/preservatif-darvador.jpg

30.5 KiB

content/slides/cri/images/proxmox.png

3.39 KiB

content/slides/cri/images/stack.png

51.4 KiB

content/slides/cri/images/terraform.png

6.07 KiB

content/slides/cri/images/vagrant.png

449 KiB

content/slides/cri/images/vault-auth.png

33.4 KiB

content/slides/cri/images/vault-ci.png

30.9 KiB

content/slides/cri/images/vault-secrets-engines.png

29.5 KiB

content/slides/cri/images/vault.png

42.1 KiB

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>manifest</title>
<link rel="stylesheet" href="../../node_modules/reveal.js/css/reveal.css">
<link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/white.css">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="../../node_modules/reveal.js/lib/css/zenburn.css">
<link rel="stylesheet" href="../../node_modules/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="../main.css">
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? '../../node_modules/reveal.js/css/print/pdf.css' : '../../node_modules/reveal.js/css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
</head>
<body>
<div class="reveal">
<div class="slides">
<section data-markdown="md/manifest.md"
data-separator="^\n\n\n"
data-separator-vertical="^\n\n"
data-separator-notes="^Note:"
data-charset="utf-8">
</section>
</div>
</div>
<script src="../../node_modules/reveal.js/lib/js/head.min.js"></script>
<script src="../../node_modules/reveal.js/js/reveal.js"></script>
<script>
// More info about config & dependencies:
// - https://github.com/hakimel/reveal.js#configuration
// - https://github.com/hakimel/reveal.js#dependencies
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: false,
dependencies: [
{ src: '../../node_modules/reveal.js/plugin/markdown/marked.js' },
{ src: '../../node_modules/reveal.js/plugin/markdown/markdown.js' },
{ src: '../../node_modules/reveal.js/plugin/notes/notes.js', async: true },
{ src: '../../node_modules/reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
]
});
</script>
</body>
</html>
## boilerplate
[ansible-role-boilerplate](https://gitlab.isima.fr/cri/ansible-role-boilerplate)
* Tous les rôles dervaient se tester aussi simplement que ça, en standalone, sans avoir peur de rien casser
* En pratique il faut parfois y réfléchir un peu
* path vault
* point de montage
* dépendance à des services existants
## Directory Layout
[Directory Layout (ansible best practice)](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#directory-layout)
```shell
+ tasks/ #
- main.yml # <- tasks file can include smaller files if warranted
+ handlers/ #
- main.yml # <- handlers file
+ templates/ # <- files for use with the template resource
- ntp.conf.j2 # <- templates end in .j2
+ files/ #
- bar.txt # <- files for use with the copy resource
- foo.sh # <- script files for use with the script resource
+ vars/ #
- main.yml # <- variables associated with this role
+ defaults/ #
- main.yml # <- default lower priority variables for this role
+ meta/ #
- main.yml # <- role dependencies
+ library/ # roles can also include custom modules
+ module_utils/ # roles can also include custom module_utils
+ lookup_plugins/ # or other types of plugins, like lookup in this case
```
## Directory Layout Bonus
* Vagrantfile -> cross OS
* vagrant.rb
* role.yml
* .gitignore
* README.md
## TODO
pacakger les box vagrant de manière synchrone avec les templates pve
\ No newline at end of file
# ansible
![ansible](images/ansible.png "ansible")<!-- .element width="30%" -->
## ansible
* outil de
* provisioning
* gestion de config
* déploiemenet d'application
* racheté par RedHat en octobre 2015
* outils équivalents
* [puppet](https://puppet.com/), [chef](https://www.chef.io/#/), [SaltStack](https://www.saltstack.com/) ...
## ansible Φ
* automatisation
* réutilisabilité
* parallélisation
* idempotence
<br />
#### toute intervention manuelle sur un système est une faute ...<!-- .element class="fragment" -->
## ... GRAVE!<!-- .element class="fragment" -->
## ansible
* écrit en python
* python 2 par défaut
* marche bien en python 3 <i class="fa fa-hand-o-left" aria-hidden="true"></i>
* virtualenv
[<i class="fa fa-book" aria-hidden="true"></i> ansible doc](https://docs.ansible.com/)
## ansible
* prérequis
* sur la machine pilote (mgmt node)
* ansible (donc python)
* sur le(s) noeud(s)
* une connextion ssh ou PowerShell
* python
## ansible
[![gestion ansible](images/ansible_mgmt.png "gestion ansible")](https://medium.com/formcept/configuration-management-and-continuous-deployment-cd0892dce998)
## terminologie
* **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
## terminologie
* **task**
* fichier où sont définies les actions réalisées par le playbook
* **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
* **facts**
* information collectée par ansible sur le système d'une machine à configurer
* peuvent être enrichis
* **handlers**
* similaire aux **tasks** mais appelables à partir d'une **task**
* typiquement redémarrage de service par exemple
## inventory
* liste des machines accessibles via ssh
* organisées par groupes
* possibilité de fixer des configurations
* pour tous / par groupe / par machine
* possibilité de déclarer des variables
* pour tous / par groupe / par machine
* fichier texte au format *ini*
[<i class="fa fa-book" aria-hidden="true"></i> inventory](https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html)
## inventory
dans `./inventory.ini`
```ini
[criprod]
ansible-test.criprod.isima.fr
[ovh]
ansible-test.ovh.isima.fr
[criprod:vars]
environment = production
[all:vars]
ansible_python_interpreter = /usr/bin/python3
ansible_user = limosadm
```
## inventory
```
Host ansible-test.criprod.isima.fr
User limosadm
Hostname 192.168.220.243
IdentityFile ~/.ssh/ids/duncan.isima.fr/limosadm/id_rsa
Host ansible-test.ovh.isima.fr
User limosadm
Hostname 10.10.100.2
IdentityFile ~/.ssh/ids/duncan.isima.fr/limosadm/id_rsa
ProxyCommand ssh duncan -W %h:%p
```
la connexion ssh doit se faire sans mot de passe sur le système
```shell
export ANSIBLE_HOST_KEY_CHECKING=False
```
## ad-hoc command
```shell
$ ansible criprod --inventory-file=inventory.ini \
-a "/usr/bin/uptime"
other1.isima.fr | CHANGED | rc=0 >>
13:12:02 up 21 days, 21:11, 2 users, load average: 0.13, 0.88, 0.13
pvecriprod2.isima.fr | CHANGED | rc=0 >>
16:18:08 up 41 days, 23:11, 3 users, load average: 0.63, 0.18, 0.10
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
```
## ad-hoc command
fonctionne avec les modules ansible
```shell
$ ansible ovh --inventory-file=inventory.ini \
--module-name ping
ansible-test.ovh.isima.fr | SUCCESS => {
"changed": false,
"ping": "pong"
}
```
avec le module raw python n'est pas nécessaire ;)
```shell
ansible ovh --inventory-file=inventory.ini \
-m raw -a "sudo apt update && sudo apt install -y python"
```
## 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: ovh # 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
```
## playbook
```shell
$ ansible-playbook my-playbook.yml \
--inventory-file=inventory.ini
```
* exécute le playbook
* sur toutes les machines définies dans `hosts:`
* en parallèle
```shell
PLAY [my-playbook] ****************************************************************************
TASK [Gathering Facts] ************************************************************************
ok: [ansible-test.ovh.isima.fr]
PLAY RECAP ************************************************************************************
ansible-test.ovh.isima.fr : ok=1 changed=0 unreachable=0 failed=0
```
## variables
* nommage
* pas de `-` pas de `.`
* pas de numérique pure
## variables
`my-playbook.yml`
```yaml
- name: my-playbook
hosts: ovh
remote_user: limosadm
vars:
awesomevar: awesome
```
`group_vars/all.yml`
```yaml
coolvar: Coool
```
## variables
[<i class="fa fa-book" aria-hidden="true"></i> debug](https://docs.ansible.com/ansible/latest/modules/debug_module.html)
```yaml
tasks:
- name: display awesome message
debug:
msg: "{{ awesomevar }}"
- name: display cool message
debug:
msg: "{{ coolvar }}"
```
## variables
```shell
PLAY [my-playbook] ****************************************************************************
TASK [Gathering Facts] ************************************************************************
ok: [ansible-test.ovh.isima.fr]
TASK [display awesome message] ****************************************************************
ok: [ansible-test.ovh.isima.fr] => {
"msg": "awesome"
}
TASK [display cool message] *******************************************************************
ok: [ansible-test.ovh.isima.fr] => {
"msg": "Coool"
}
PLAY RECAP ************************************************************************************
ansible-test.ovh.isima.fr : ok=3 changed=0 unreachable=0 failed=0
```
## variables
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.
## variables
* 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> 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)
* [<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)
## facts
* valeurs collectées par ansible à l'exécution du playbook
```yaml
- name: display hostname
debug:
msg: "System {{ inventory_hostname }}"
- name: display os family
debug:
msg: "comes from family {{ ansible_os_family }}"
- name: HOSTVARS (ANSIBLE GATHERED, group_vars, host_vars)
debug:
msg: "{{ hostvars | to_yaml }}"
```
[<i class="fa fa-book" aria-hidden="true"></i> Variables discovered from systems: Facts](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variables-discovered-from-systems-facts)
## jinja
[<i class="fa fa-book" aria-hidden="true"></i> templating](https://docs.ansible.com/ansible-container/container_yml/template.html)
utilisable partout (playbook, role, tasks, template)
## filters
[<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 le contenu de la variable (un path)
* sans les 4 derniers caractères
* avec les `/` remplacés par des `-`
[<i class="fa fa-book" aria-hidden="true"></i> developing filters](https://docs.ansible.com/ansible/latest/dev_guide/developing_plugins.html#developing-particular-plugin-types)
## 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')}}"
```
```yaml
- name: lit un secret dans vault (mais on fera pas comme ça)
debug:
msg: "{{ lookup('hashi_vault', 'secret=secret/hi:value token=xxx url=http://myvault')}}"
```
```yaml
- name: lit une variable d'environnement sur le noeud pilote
debug:
msg: "{{ lookup('env','PVE_NODE') }}"
```
[<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> developing lookups](https://docs.ansible.com/ansible/latest/dev_guide/developing_plugins.html#developing-particular-plugin-types)
## task
[<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
loop_control:
index_var: key_index
```
* marche avec
* n'importe quelle variable itérable
* [fileglob](https://docs.ansible.com/ansible/latest/plugins/lookup/fileglob.html) - fichiers par pattern
* [filetree](https://docs.ansible.com/ansible/latest/plugins/lookup/filetree.html) - tous les fichiers récursivement
* ...
## 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
- name: affiche un message sur la vezrison de l'os
shell: echo "only on Red Hat 6, derivatives, and later"
when: |
ansible_facts['os_family'] == "RedHat"
and ansible_facts['lsb']['major_release']|int >= 6
```
conditions jinja, à la python:
* not, is, empty, in ...
## ignore_errors
* permet de continuer l'exécution du playbook
* même en cas de retour d'erreur d'une commande
```yaml
- name: get mysqladmin status
shell: mysqladmin status
ignore_errors: True
```
## failed_when
* permet de forcer à stopper l'exécution du playbook
* sur une condition
```yaml
- name: get mysqladmin
shell: mysqladmin status
failed_when: "'FAILED' in command_result.stderr"
```
[<i class="fa fa-book" aria-hidden="true"></i> fail - Fail with custom message](https://docs.ansible.com/ansible/latest/modules/fail_module.html)
* parfois ignorer l'erreur ne suffit pas pour continuer
* il faut ajouter `failed_when`
```yaml
- name: get mysqladmin
shell: mysqladmin status
ignore_errors: True
failed_when: no
```
## [command modules](https://docs.ansible.com/ansible/latest/modules/list_of_commands_modules.html)
* [<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
- name: redirige la sortie de somescript.sh dans somelog.txt
shell: somescript.sh >> somelog.txt
args:
chdir: somedir/ifcon
creates: somelog.txt
```
## register
[<i class="fa fa-book" aria-hidden="true"></i> register](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#registering-variables)
dans une variable
```yaml
- name: le service pam est il lancé
shell: "ps -aux | grep pam"
register: pam_status
```
dans une liste
```yaml
- name: les services sshd, systemd, dbus sont ils lancés
shell: "ps -aux | grep {{ item }}"
register: services_status
loop:
- sshd
- systemd
- dbus
```
## register (<i class="fa fa-gift" aria-hidden="true"></i>)
[<i class="fa fa-book" aria-hidden="true"></i> Return Values](https://docs.ansible.com/ansible/latest/reference_appendices/common_return_values.html)
```json
"msg": {
"changed": true,
"cmd": "ps -aux | grep pam",
"delta": "0:00:00.011674",
"end": "2019-01-23 20:27:24.836966",
"failed": false,
"rc": 0,
"start": "2019-01-23 20:27:24.825292",
"stderr": "",
"stderr_lines": [],
"stdout": "limosadm 22227 0.0 0.1 193868 2688 ? S 20:27 0:00 (sd-pam)\nlimosadm 22359 0.0 0.0 4628 856 pts/0 S+ 20:27 0:00 /bin/sh -c ps -aux | grep pam\nlimosadm 22361 0.0 0.0 14856 1100 pts/0 S+ 20:27 0:00 grep pam",
"stdout_lines": [
"limosadm 22227 0.0 0.1 193868 2688 ? S 20:27 0:00 (sd-pam)",
"limosadm 22359 0.0 0.0 4628 856 pts/0 S+ 20:27 0:00 /bin/sh -c ps -aux | grep pam",
"limosadm 22361 0.0 0.0 14856 1100 pts/0 S+ 20:27 0:00 grep pam"
]
}
```
## register (<i class="fa fa-gift" aria-hidden="true"></i>)
afficher l'output
```yaml
- name: afficher la sortie de la commande
debug:
msg: pam_status.stdout
```
itérer sur une liste
```yaml
- name: afficher la sortie de chaque commande
debug:
msg: "{{ services_status.results[item].stdout }}"
loop: "{{ range(0, 3)|list }}"
```
ou
```yaml
- name: afficher la sortie de chaque commande
debug:
msg: "{{ item.stdout }}"
loop: "{{ services_status.results }}"
```
## register (<i class="fa fa-gift" aria-hidden="true"></i>)
```yaml
- name: register foo
shell: echo "foo"
register: txt
```
```yaml
- name: register bar
shell: echo "bar"
register: txt
when: False
```
If a task fails or is skipped, **the variable still is registered with a failure or skipped status**
## modules
* [<i class="fa fa-book" aria-hidden="true"></i> file](https://docs.ansible.com/ansible/latest/modules/file_module.html)
* [<i class="fa fa-book" aria-hidden="true"></i> lineinfile](https://docs.ansible.com/ansible/latest/modules/lineinfile_module.html)
* [<i class="fa fa-book" aria-hidden="true"></i> copy](https://docs.ansible.com/ansible/latest/modules/copy_module.html)
* [<i class="fa fa-book" aria-hidden="true"></i> template](https://docs.ansible.com/ansible/latest/modules/template_module.html)
* [<i class="fa fa-book" aria-hidden="true"></i> stat](https://docs.ansible.com/ansible/latest/modules/stat_module.html)
* [<i class="fa fa-book" aria-hidden="true"></i> get_url](https://docs.ansible.com/ansible/latest/modules/get_url_module.html)
* [<i class="fa fa-book" aria-hidden="true"></i> unarchive](https://docs.ansible.com/ansible/latest/modules/unarchive_module.html)
## modules
* [<i class="fa fa-book" aria-hidden="true"></i> package](https://docs.ansible.com/ansible/latest/modules/package_module.html)
* [<i class="fa fa-book" aria-hidden="true"></i> user](https://docs.ansible.com/ansible/latest/modules/user_module.html)
* [<i class="fa fa-book" aria-hidden="true"></i> systemd](https://docs.ansible.com/ansible/latest/modules/systemd_module.html)
* [<i class="fa fa-book" aria-hidden="true"></i> pip](https://docs.ansible.com/ansible/latest/modules/pip_module.html)
* [<i class="fa fa-book" aria-hidden="true"></i> expect](https://docs.ansible.com/ansible/latest/modules/exepect_module.html)
* `pip install pexpect`
* [<i class="fa fa-book" aria-hidden="true"></i> windows modules](https://docs.ansible.com/ansible/latest/modules/list_of_windows_modules.html)
* [<i class="fa fa-book" aria-hidden="true"></i> ...](https://docs.ansible.com/ansible/latest/modules/modules_by_category.html)
## handlers
```yaml
handlers:
- name: restart apache
service:
name: apache2
state: restarted
listen: "restart apache"
tasks:
- name: enable some apache modules
apache2_module:
state: present
name: "{{ item }}"
notify: restart apache
```
## pre / post tasks
```yaml
pre_tasks:
- name: update sources
apt:
update_cache: yes
tags: [base]
...
post_tasks:
...
```
## tags
tags au niveau tâches
```yaml
- name: MySQL to listen on all interfaces, not just localhost
lineinfile:
dest: /etc/mysql/mariadb.conf.d/50-server.cnf
regexp: "^bind-address = 127.0.0.1"
line: "#bind-address = 127.0.0.1"
tags: [database]
```
`always` tag spécial exécuté à tous les coups
```yaml
pre_tasks:
- name: update sources
apt:
update_cache: yes
tags: [always]
```
## tags
```shell
$ ansible-playbook my-playbook.yml --list-tags
```
liste tous les tags disponibles dans le playbook
```shell
$ ansible-playbook my-playbook.yml --tags database
```
n'exécute que les tâches du playbook ayant un tag `database`
```shell
$ ansible-playbook my-playbook.yml --skip-tags database
```
exécute toutes les tâches du playbook sauf celles ayant un tag `database`
## dry run
```shell
$ ansible-playbook my-playbook.yml --check --diff
```
`--check`
simule les tâches à effectuer sans les effectuer (dry-run)
`--diff`
indique ce qui change
## verbosity
```shell
$ ansible-playbook my-playbook.yml -vvv
```
`-v`, `-vv`, `-vvv`, `-vvvv`
pour la verbosité
## limit
```shell
$ ansible-playbook my-playbook.yml --limit=py.isima.fr
```
exécute toutes les tâches du playbook sur py.isima.fr uniquement
<i class="fa fa-hand-o-down" aria-hidden="true"></i>
[<i class="fa fa-book" aria-hidden="true"></i> ansible-playbook](https://docs.ansible.com/ansible/latest/ansible-playbook.html)
## roles
```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:
- 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
```
## layout
[<i class="fa fa-book" aria-hidden="true"></i> Directory Layout](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#directory-layout)
[<i class="fa fa-book" aria-hidden="true"></i> Alternative Directory Layout](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#alternative-directory-layout)
[<i class="fa fa-gitlab" aria-hidden="true"></i> cri/ansible-role-boilerplate](https://gitlab.isima.fr/cri/ansible-role-boilerplate)
## roles
* [<i class="fa fa-gitlab" aria-hidden="true"></i> cri/ansible-role-vault](https://gitlab.isima.fr/cri/ansible-role-vault)
* [<i class="fa fa-gitlab" aria-hidden="true"></i> cri/ansible-role-gitlab](https://gitlab.isima.fr/cri/ansible-role-gitlab)
* [<i class="fa fa-gitlab" aria-hidden="true"></i> cri/ansible-role-ispconfig](https://gitlab.isima.fr/cri/ansible-role-ispconfig/)
* [<i class="fa fa-book" aria-hidden="true"></i> debops](https://docs.debops.org/en/master/)
* [<i class="fa fa-github" aria-hidden="true"></i> bau-sec/ansible-openvpn-hardened](https://github.com/bau-sec/ansible-openvpn-hardened)
* [<i class="fa fa-github" aria-hidden="true"></i> ...](https://github.com/)
### skeleton
```shell
$ git clone git@gitlab.isima.fr:cri/ansible-role-boilerplate.git
$ ansible-galaxy init --role-skeleton ansible-role-boilerplate gitlab
```
* dev
```shell
$ ./bin/setup
$ source ./.venv/bin/activate
$ vagrant up
```
* utilisation dans un playbook
`requirements.yml`
```yaml
- name: vault
src: git+ssh://git@gitlab.isima.fr/cri/ansible-role-vault.git
path: ./roles/remotes
```
```
$ ansible-galaxy install -f -r requirements.yml
```
## [<i class="fa fa-book" aria-hidden="true"></i> callback](https://docs.ansible.com/ansible/latest/plugins/callback.html)
```shell
[20:59:19] Install unixODBC | default | CHANGED | 2162ms
[20:59:21] Install Vlogger, Webalizer, and AWstats | default | SUCCESS | 6727ms
[20:59:28] comment awstas croned jobs | default | CHANGED | 1410ms
[20:59:30] Debconf for roundcube-core | default | CHANGED | 1510ms
[20:59:31] Install roundcube and dependencies | default | SUCCESS | 10607ms
[20:59:42] remove the # in front of the first 2 alias line | default | CHANGED | 452ms
[20:59:42] add the line "AddType application/x-httpd-php .php" right after the "<Directory /var/lib/roundcube>" line | default | SUCCESS | 558ms
[20:59:43] change the default host to localhost | default | CHANGED | 587ms
[20:59:44] Install Vlogger, Webalizer, and AWstats | default | SUCCESS | 10966ms
[20:59:55] download jailkit | default | SUCCESS | 862ms
[20:59:55] untar jailkit | default | CHANGED | 1119ms
[20:59:57] untar jailkit | default | CHANGED | 176ms
[20:59:57] build jailkit deb | default | CHANGED | 2655ms
[20:59:59] Install jailkit .deb package | default | CHANGED | 2067ms
[21:00:02] remove jailkit stufff | default | CHANGED | 177ms
[21:00:02] install fail2ban | default | SUCCESS | 1584ms
```
## ansible.cfg
```ini
[defaults]
roles_path = ./ansible/roles/remotes:./ansible/roles/apps:./ansible/roles/commons:./ansible/roles/services
inventory = ./ansible/inventory.ini
filter_plugins = ./ansible/plugins/filter:
lookup_plugins = ./ansible/plugins/lookup:
callback_plugins = ./ansible/plugins/callback:
module_utils = ./ansible/module_utils:
stdout_callback = anstomlog
deprecation_warnings = False
[privilege_escalation]
become: yes
become_user: root
become_method: sudo
```
## [<i class="fa fa-book" aria-hidden="true"></i> set_fact](https://docs.ansible.com/ansible/latest/modules/set_fact_module.html) & pre_tasks
```yaml
criprod:
pvecriprod1:
api_users:
- proxmoxapi
- vimazeno
```
```yaml
- name: provisionner l'environnement du noeud (pour y accéder plus facilement dans les roles)
set_fact:
_pve: "{ 'cluster': '{{ lookup('env','PVE_CLUSTER') }}', 'node': '{{ lookup('env','PVE_NODE') }}', 'host': '{{ lookup('env','PVE_HOST') }}'}"
- name: provisionner les utilisateurs d'api pve uniquement du noeud (pour y accéder plus facilement dans les roles)
set_fact:
api_users: "{ 'api_users': {{ hostvars[inventory_hostname][_pve.cluster][_pve.node]['api_users'] }}}"
- name: fusionner l'environnement du noeud (pour y accéder plus facilement dans les roles)
set_fact:
pve: "{{ _pve | combine(api_users) }}"
```
[<i class="fa fa-gitlab" aria-hidden="true"></i> réorganiser les variables dans une pre_task](https://gitlab.isima.fr/cri/stack/blob/master/ansible/pre-tasks/set-pve-vars.yml)
## extend
[<i class="fa fa-book" aria-hidden="true"></i> developing plugins](https://docs.ansible.com/ansible/latest/dev_guide/developing_plugins.html)
[<i class="fa fa-book" aria-hidden="true"></i> developing modules](https://docs.ansible.com/ansible/latest/dev_guide/developing_modules.html)
# backup
## service CRI ISIMA / LIMOS
![service CRI ISIMA / LIMOS](https://support.isima.fr/upload/logo/cri_.png)<!-- .element width="30%" -->
### Vincent Mazenod
[vincent.mazenod@isima.fr](maitlo:vincent.mazenod@isima.fr)
#### responsable de service
## 🔧 service CRI ISIMA / LIMOS
* [Missions](https://doc.isima.fr/support/cri#3-missions) / [organisation](https://doc.isima.fr/cri#1-organisation-du-support)
* [Composition](https://doc.isima.fr/support/cri#2-composition)
* 7 membres support (A109 /A115)
* ### 📘 [https://doc.isima.fr](https://doc.isima.fr)
* 💁 Support
* 🎫 [tickets incidents/demandes](https://support.isima.fr)
* [https://support.isima.fr](https://support.isima.fr)
* 🏨 Bureau A109
* 📞 Téléphone 0473405262
## 📝 Inscription (1/2)
* [https://inscription.uca.fr](https://inscription.uca.fr)
* se munir de son numéro CVEC
* [https://cvec.etudiant.gouv.fr](https://cvec.etudiant.gouv.fr)
* procédure d’inscription en fonction du cursus
* Primo entrants:
* **n°OPI date de naissance** + **mail personnel**
* Anciens étudiants:
* **n°étudiant** + **date de naissance** + **mail personnel**
## 📝 Inscription (2/2)
* 💵 Règlement financier pour finaliser l'inscription
* Aurion Web (INP)
* 😥 Pas de compte = pas de service
* ⏰ S'inscrire avant le 11 septembre!
* 💬 Questions Scola:
* 📨 [scolarite@isima.fr](mailto:scolarite@isima.fr)
* 🏨 Bureau A010
## 🔌 Compte UCA
* 🏦 ENT ([https://ent.uca.fr](https://ent.uca.fr))
* mon compte > mot de passe
* notes
* emplois du temps
* cours en ligne
* 📨 [Mail](https://doc.isima.fr/services/mail/uca) ([https://mail.uca.fr](https://mail.uca.fr))
* prenom.nom@etu.uca.fr
* prenom.nom@etu.isima.fr (alias)
## 🔖 Services UCA
* 📶 [WiFi (Eduroam)](https://doc.isima.fr/locaux/wifi) ([https://cat.eduroam.org](https://cat.eduroam.org))
* 📹 [Teams](https://doc.isima.fr/services/visio/teams) ([https://teams.microsoft.com](https://teams.microsoft.com))
* 📁 Drive
* [drive UCA (Seafile)](https://doc.isima.fr/services/stockage/seafile) [https://drive.uca.fr/](https://drive.uca.fr/)
* [OneDrive (1To)](https://doc.isima.fr/services/stockage/owncloud)
* 🔍 [Catalogue de services UCA](https://dsi.uca.fr/catalogue-de-services)
## 🔐 Mots de passe
* ça ne se prête pas
* ça ne se laisse pas traîner à la vue de tous
* ça ne s'utilise qu'une fois
* si ça casse on remplace immédiatement
* un peu d'originalité ne nuit pas
* la taille compte
* il y a une date de péremption
* mieux vaut les avoir avec soi
## 💉 question d'hygiène!
![preservatif](images/preservatif-darvador.jpg)<!-- .element width="30%" -->
* [CNIL / Authentification par mot de passe : les mesures de sécurité élémentaires](https://www.cnil.fr/fr/authentification-par-mot-de-passe-les-mesures-de-securite-elementaires)
* [ANSSI / Recommandations relatives à l'authentification multifacteur et aux mots de passe](https://www.ssi.gouv.fr/guide/recommandations-relatives-a-lauthentification-multifacteur-et-aux-mots-de-passe/)
## 🏦 [Locaux](https://doc.isima.fr/locaux/salles)
![bâtiments](images/batiments.png "batiments")
## 🖥 [Salles informatiques](https://doc.isima.fr/pedagogie/salles)
* Salles PC :
* Dual boot Windows / Linux
* Salles Spécialisées :
* systèmes et réseaux
* physique
* électronique
* circuits
* robotique
* réalité virtuelle
## 🖥 [Salles informatiques](https://doc.isima.fr/pedagogie/salles)
* Salles Tx :
* D013 et 💻 D018 (libre accès de 7h30 à 18h45 en semaine)
* Laboratoire de langue
* G116 (Bâtiment Pôle Commun)
## 🖥 [Serveurs pédagogiques](https://doc.isima.fr/pedagogie/serveurs)
* TSE1 (MS Windows server 2016R2)
* Ada (GNU/Linux Debian 12)
* Turing (GNU/Linux Debian 12)
* Exam (GNU/Linux CentOS 6 isolé)
* 🔌 Connexion possible
* [Ligne de commande (ssh/kerberos)](https://doc.isima.fr/services/acces-distant/ssh/kerberos)
* [Bureau distant (RDP)](https://doc.isima.fr/services/acces-distant/rdp)
* [Bureau distant (Guacamole)](https://doc.isima.fr/services/acces-distant/guacamole/)
## 🖥 [VM Perso](https://doc.isima.fr/pedagogie/vm)
* Debian 12 / Cinnamon
* 🔌 Connexion possible
* [Ligne de commande (ssh/kerberos)](https://doc.isima.fr/services/acces-distant/ssh/kerberos)
* [Bureau distant (RDP)](https://doc.isima.fr/services/acces-distant/rdp)
* [Bureau distant (Guacamole)](https://doc.isima.fr/services/acces-distant/guacamole/)
* 😴 Eteinte toutes les nuits à 2h00 du matin
* ▶ start / ◼ stop
* https://my.isima.fr/vm
## 🕵🏼 [Authentification](https://doc.isima.fr/authentification)
* 🔌 Compte UCA pour **tous les services**
* [Bureau distant (Guacamole)](https://doc.isima.fr/services/acces-distant/guacamole/),
[Forges logicielles](https://doc.isima.fr/services/gitlab),
[Gestionnaire de ticket](https://doc.isima.fr/services/gestsup) ...
* ouverture de session
* [impressions](https://doc.isima.fr/services/imprimantes)
* 😥 Pas de compte = pas de service
* ⏰ S'inscrire avant le 11 septembre!
## 🖨 [Impressions](https://doc.isima.fr/services/imprimantes/#impression-pour-les-etudiants)
* Facturées directement sur la carte [IZLY](https://dsi.uca.fr/catalogue-de-services/impression-izly)
* Toutes les imprimantes de l'UCA sont utilisables
* File d'impression itinérante **FollowMe**
* le copieur de la salle D013
* permet de recharger son compte [IZLY](https://dsi.uca.fr/catalogue-de-services/impression-izly)
## 🌃 [Accés distant](https://doc.isima.fr/services/acces-distant/)
* Connexion de puis l'extérieur
* [VPN](https://doc.isima.fr//services/acces-distant/vpn)
* 🔌 Connexion possible
* [Ligne de commande (ssh/kerberos)](https://doc.isima.fr/services/acces-distant/ssh/kerberos)
* [Bureau distant (RDP)](https://doc.isima.fr/services/acces-distant/rdp)
* [Bureau distant (Guacamole)](https://doc.isima.fr/services/acces-distant/guacamole/)
Pour les 🖥 [Serveurs pédagogiques](https://doc.isima.fr/pedagogie/serveurs), 🖥 [Salles informatiques](https://doc.isima.fr/pedagogie/salles), 🖥 [VMs Persos](https://doc.isima.fr/pedagogie/vm)
## 💾 [Données (~/shared)](https://doc.isima.fr/stockage/shared)
* 5Go
* != drive.uca.fr
* dirs.local.isima.fr
* [Ligne de commande (ssh/kerberos)](https://doc.isima.fr/services/acces-distant/ssh/kerberos)
* nfs
* samba
* Montage automatique PARTOUT
* Répertoire `~/shared` sous GNU/Linux et MacOS
* Montage réseau `P:\\` sous MS Windows
## 💀 WARNING!!
* 🤦 Tout peut être réinstallé à tout moment
* Les salles machine
* Les serveurs péda
* Votre VM Perso
* 🙇🏼 `~/shared` et `P:\\` est le seul répertoire sauvegardé
* Tout le reste peut disparâitre
* A tout moment!!
## 🕸 Services
* [Forges logicielles (Gitlab)](https://doc.isima.fr/services/gitlab): https://gitlab.isima.fr
* [Prise de notes (Hedgedoc)](https://doc.isima.fr/services/hedgedoc): https://hedgedoc.isima.fr
* [Page web personnel](https://doc.isima.fr/services/hebergement-web/perso): https://perso.isima.fr/~login
* Une plateforme de Cloud Computing
* contacter le [service CRI ISIMA/LIMOS](https://doc.isima.fr/support/cri)
* Plateforme HPC (accès restreint)
* contacter [Hélène Toussaint](mailto:helene.toussaint@isima.fr)
* module ED d'apprentissage au LIMOS
## 🎁 Logiciels
* Microsoft Office et Office 365
* https://doc.isima.fr/Imagine/office/
* Azure dev tools for teaching
* https://doc.isima.fr/Imagine/imagine/
## 👋 [Cadres légaux](https://doc.isima.fr/support/cadres)
* [règlement intérieur de l'ISIMA](https://ent.uca.fr/moodle/mod/page/view.php?id=263490)
* [Charte générale à l'usage des ressources numériques / UCA](https://www.uca.fr/medias/fichier/deliberation-ca-2017-10-27-21-charte-des-usages-numeriques-et-des-administrateurs-techniques-annexe_1509372123880-pdf)
* Cadre national [ANSSI](https://www.ssi.gouv.fr/en/), [PSSIE](https://www.ssi.gouv.fr/entreprise/reglementation/protection-des-systemes-dinformations/la-politique-de-securite-des-systemes-dinformation-de-letat-pssie/)
* Sanctions disciplinaires et pénales
* 🙏 Soyez "fair"
* si vous trouvez une vulnérabilité, 😎 signalez la au [service CRI ISIMA/LIMOS](https://doc.isima.fr/support/cri)
## 💬 Des questions ????
![](https://media.giphy.com/media/hSKk6hx9OzomRvFRcJ/giphy.gif)<!-- .element style="margin: 20px" -->
📘 **https://doc.isima.fr** 🎫 **https://support.isima**
🤗 **[Typos et suggestions](https://gitlab.isima.fr/vimazeno/blog.limos.fr)**
# criprod
#### l'informatique qui marche!
## galactica
* navire sans capitaine
* plus d'image package
* plus de support sur les problèmes
* pas de mise à jour de la plateforme
* héberge des services critiques
* fonctionne à date
* ok pour la recherche
* source d'inspiration
## Et si ...
on réfléchissait au prochain système de virtualisation
* maintenable
* redéployable
* scalable
* utilisable
## par tous!
fini les SPOFs
#### on gère tous un datacenter home made!
## loi de Murphy
* tout cassera à un moment ou à un autre
* mauvaise config
* mise à jour foireuse
* piratage
* panne matérielle
au plus mauvais moment si possible
## loi de Murphy
* réparer c'est bien mais ce n'est pas toujours possible
* temps d'investigation
* données perdues
* configuration manquantes
* expertise
## Alors?
* On redéploie
* vite
* souvent
* les yeux fermés
* tout le datacenter de préférence
* toutes les machines et tous les services
## komankonfé
il nous faut
* des routines de sauvegarde
* des routines de déploiement
* des routines de restauration
## en terme de ressources ...
* 2 (cluster d')hyperviseurs
* un pour la prod
* un pour la redondance
* un serveur pour
* sauvegarder la prod
* déployer et restaurer tous les services sur l'hyperviseur
# TOUTES LES NUITS!
## chaque service a un double
* prêt à prendre le relais
* tous les déploiements sont testés toutes les nuits
### On a plus peur!
## et t'as des machines pour ça
* récupérons tout
* on veut que ça pète
* pour se persuader qu'on sait remonter les yeux fermés
#### Pour faire de la bonne cuisine il faut ...
* des outils / ustensiles
* un **cluster** d'hyperviseur **proxmox**
* **terraform** pour crééer TOUTES les VMs nécessaires à nos services
* **terraform** maintient l'état (en term d'inventaire) de notre **datacenter**
#### Pour faire de la bonne cuisine il faut ...
* des recettes
* des déploiements automatisé avec **ansible** ou **maison**
* versionnés sur un **gitlab** accessible en ldap ET avec le mot de passe root
* des ingrédients
* un gestionnaire de secret **vault** accessible en ldap ET avec le mot de passe root
## PCA / PRA
* Donnez nous
* un **gitlab** avec les bonnes recettes de déploiement
* un fichier texte **terraform** décrivant l'état du datacenter
* les mots de passe nécessaires au déploiement
## Et on reconstruit tout!
### en 1 ligne de commande
### Est ce qu'on fait pas chier pour rien?
* les routines de déploiements
* sont agnostiques de l'hyperviseur
* sont autodocumentées
* l'infra est reproductible
* sur aws, google cloud, ...
* sur openstack (mouahahaha!)
c'est un bonne opportunité de peaufiner le nettoyage entamer il y bientôt 2 ans
# les devs peuvent nous aider
## si on dit s'il te plaît
## On pourra mettre "DevOps" comme skills linkedin ...
## ... Et parler de sujet fun à l'apéro ;)
## Next step 1
* présentation de **proxmox**
* son installation (william)
* son utilisation avec **terraform**
* réflexion pour que tout le cri (voir l'équipe dev) puissent créer des vms
* chacun pousse sa vms avec un playbook offert pour la maison
* y a rien à casser
## Next step 2
* Présentation d'**ansible** au travers de 3 services: **gitlab**, **vault**, **my isima**
* réflexion pour que tout le cri ait en tête les bonnes pratiques pour écrire & architecturer correctement ses playbooks ansible ou maison
* un projet a un cycle de vie probablement standard (install, configure, initialize, restore, backup)
## Next step 3
* Présentation de **vault**
* consulter / écrire des secrets
* réflexion pour automatiser l'écriture des secrets dans la configuration de nos playbooks
* les devs peuvent nous aider
## Next step 4
* Présentation de HaProxy et de la gestion des certificats **SSL**
* créer une entrée dans **HaProxy**
* créer une entrée dans **Bind**
* rendre une machine visible sur un port
* installer son certificat
* réflexion pour automatiser l'écriture de la configuration **HaProxy**, **DNS**, et **ssl**
* les devs peuvent nous aider
## Next step 5
* mise en place du backup et du cluster backup avec redéploiement automatique quotidien
* chacun migre ses services
* et se pose la question de son binôme pour ce service
## Next step 6
* c'est déjà la rentrée ;)
## Next step 7
* démontage de galactica au profit de cluster de proxmox pour la recherche ;)
## Next step 8
![apéro](images/apero.gif "apéro")<!-- .element: width="85%" -->
# DevOps
![DevOps](images/devops-toolchain.png "DevOps")
## Pourquoi?
* unifier
* développement logiciel (dev)
* administration des infrastructures (ops)
* automatiser (automation)
* suivre (monitoring)
* tester: automatiquement
* accélérer: cycles courts à prioriser
* déployer: automatiquement & souvent!
## contexte ISIMA / LIMOS
![team cri](images/cri.jpeg "team cri")
* ambiance tendue entre dev et ops !
* on cherche à
* automatiser la gestion de nos services
* autonomiser les dev et idéalement les users
## De nombreux outils
![DevOps tools](images/devops-tools.png "DevOps tools")
## les outils du dialogue
* [vagrant](vagrant.html)
* [ansible](ansible.html)
* [vault](vault.html)
* [proxmox](pve.html)
* [terraform](terraform.html)
* [gitlab](gitlab.html)
## bws aka la stack
!["stack"](images/stack.png "stack")
## 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)
# gitlab
## CI/CD variables
https://gitlab.isima.fr/cri/my/settings/ci_cd
* https://docs.gitlab.com/ee/ci/yaml/ (When:manual) pour le déploiement
## personal tokens
niveau user
https://gitlab.isima.fr/profile/personal_access_tokens
* api
* Grants complete read/write access to the API, including all groups and projects.
* read_user
* Grants read-only access to the authenticated user's profile through the /user API endpoint, which includes username, public email, and full name. Also grants access to read-only API endpoints under /users.
* read_repository
* Grants read-only access to repositories on private projects using Git-over-HTTP (not using the API).
### root only
* sudo
* Grants permission to perform API actions as any user in the system, when authenticated as an admin user.
## feed token
niveau user
https://gitlab.isima.fr/profile/personal_access_tokens
* Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when when your calendar application loads a personalized calendar, and is included in those feed URLs.
* It cannot be used to access any other data.
## deploy tokens
niveau repo
https://gitlab.isima.fr/cri/my/settings/repository#js-deploy-tokens
Deploy tokens allow read-only access to your repository and registry images.
## deploy keys
niveau repo
https://gitlab.isima.fr/cri/my/settings/repository#js-deploy-tokens
Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one.
## specific runners
https://gitlab.isima.fr/cri/my/settings/ci_cd
## best practice
* bin/setup (APP_TOKEN - gitlab secret variable / fallback ldap) bin/activate