diff --git a/content/slides/cri/images/cri.jpeg b/content/slides/cri/images/cri.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..0751e205bc62a9faf161d131f484358a1877804a Binary files /dev/null and b/content/slides/cri/images/cri.jpeg differ diff --git a/content/slides/cri/images/devops-toolchain.png b/content/slides/cri/images/devops-toolchain.png new file mode 100644 index 0000000000000000000000000000000000000000..50cf752e4aaa3f9961181dc1c75ee8f5e2f227b3 Binary files /dev/null and b/content/slides/cri/images/devops-toolchain.png differ diff --git a/content/slides/cri/images/devops-tools.png b/content/slides/cri/images/devops-tools.png new file mode 100644 index 0000000000000000000000000000000000000000..66183012626a680e51121cc06e180edfa1546f1a Binary files /dev/null and b/content/slides/cri/images/devops-tools.png differ diff --git a/content/slides/cri/md/ansible.md b/content/slides/cri/md/ansible.md index e04114c08ab7a219878d0d38b79033941d2292da..e551af2ea92628fb659231f5c27039ba4e2313d9 100644 --- a/content/slides/cri/md/ansible.md +++ b/content/slides/cri/md/ansible.md @@ -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 diff --git a/content/slides/cri/md/devops.md b/content/slides/cri/md/devops.md index ba5ded712d1c91b2ca071a187c3e4f9d2135a87a..e6b8d6056da660280c08fa2399037b456fe275f8 100644 --- a/content/slides/cri/md/devops.md +++ b/content/slides/cri/md/devops.md @@ -1,7 +1,50 @@ # DevOps -https://en.wikipedia.org/wiki/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 + + + + +## contexte ISIMA / LIMOS + + + +* 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) diff --git a/content/slides/cri/md/vagrant.md b/content/slides/cri/md/vagrant.md index 5a5f96b26eadd1472746a540df906d13e12ce446..b92b9d590c243e9cf1feb7ee19d0a5c01959e950 100644 --- a/content/slides/cri/md/vagrant.md +++ b/content/slides/cri/md/vagrant.md @@ -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) diff --git a/content/slides/cri/md/vault.md b/content/slides/cri/md/vault.md index 8e7f0d3608506e9d3669a1f80bf13975cffe1316..9279e9e4bdfd234986e20b8dbf4c1f4e52eb5da5 100644 --- a/content/slides/cri/md/vault.md +++ b/content/slides/cri/md/vault.md @@ -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) diff --git a/content/slides/index.html b/content/slides/index.html index 75af1ca2e3e88c674ed2ef17c0254806dbce42f9..fd58101462a0909c8b602163c974cd0f8c189d55 100644 --- a/content/slides/index.html +++ b/content/slides/index.html @@ -1,5 +1,26 @@ -<h3>1337</h3> +<h3>privacy</h3> +<ul> + <li> + <a href="privacy/jnarac.html">je n'ai rien à cacher</a> + <ul> + <li><a href="1337/http.html">http</a></li> + <li><a href="privacy/sovereignty.html">souveraineté</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 à cacher</a> - <ul> - <li><a href="1337/http.html">http</a></li> - <li><a href="privacy/sovereignty.html">souveraineté</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>