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 @@ ...@@ -22,23 +22,28 @@
* héritage * héritage
* réutilisabilité * réutilisabilité
* parallélisation * parallélisation
* automatisation
#### toute intervention manuelle sur un système est une faute ...
## ... GRAVE!
## ansible ## ansible
* écrit en python * écrit en python
* python 2 par défaut * python 2 par défaut
* marche bien en python 3 * marche bien en python 3 <3
* virtualenv * virtualenv
* [ansible docs](https://docs.ansible.com/) * [<i class="fa fa-book" aria-hidden="true"></i> ansible](https://docs.ansible.com/)
## ansible ## ansible
* prérequis * prérequis
* sur la machine pilote (mgmt node) * sur la machine pilote (mgmt node)
* ansible * ansible (donc python)
* sur le(s) noeud(s) * sur le(s) noeud(s)
* une connextion ssh ou PowerShell * une connextion ssh ou PowerShell
* python * python
...@@ -51,36 +56,53 @@ ...@@ -51,36 +56,53 @@
## terminologie ## terminologie
* **mgmt node** (machine pilote) machine surlaquelle ansible est installé et responsable de la configuration de toutes les machines gérées. * **mgmt node** (machine pilote)
* **inventory** (inventaire) fichier contenant les ip de tous les serveurs à configurer * machine sur laquelle ansible est installé
* **playbook** gère la configuration à déployer sur chaque serveur * pilote la configuration de toutes les machines de l'inventaire
* **task** fichier où sont définies les actions réalisées par le playbook * **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 ## 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. * **module**
* **role** permet d'organiser les playbooks en parties claires et réutilisables * 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 ## terminologie
* **play** est l'exécution d'un playbook sur un serveur * **play**
* **facts** information collectée par ansible sur le système du serveur à configurer * est l'exécution d'un playbook sur une machine
* **handlers** similaire aux **tasks** mais appelable à partir d'une **task** (redémarrage de service par exemple) * **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 ## inventory
* fichier texte au format *ini* * fichier texte au format *ini*
* organiser par groupes * 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 ```ini
[ovh] [criprod]
duncan pvecriprod2.isima.fr
ispconfig-duncan py.criprod.isima.fr
gitlab-runner-duncan gitlab-runner1.criprod.isima.fr
[all:vars] [all:vars]
environment = production environment = production
...@@ -94,106 +116,311 @@ ansible_user = limosadm ...@@ -94,106 +116,311 @@ ansible_user = limosadm
* utilisez ~/.ssh/config * utilisez ~/.ssh/config
``` ```
Host duncan Host pvecriprod2.isima.fr
User limosadm User limosadm
IdentityFile ~/.ssh/keys/limosadm IdentityFile ~/.ssh/keys/limosadm
Hostname duncan.isima.fr
Host ispconfig-duncan Host py.criprod.isima.fr
User limosadm User limosadm
Hostname 10.10.100.2
IdentityFile ~/.ssh/keys/limosadm 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 all --inventory-file=inventory.ini --module-name ping
$ ansible ovh -a "/usr/bin/uptime"
duncan | CHANGED | rc=0 >> pvecriprod2.isima.fr | SUCCESS => {
18:15:42 up 16 days, 43 min, 1 user, load average: 0,10, 0,10, 0,03 "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 >> pvecriprod2.isima.fr | CHANGED | rc=0 >>
18:15:45 up 15 days, 1:00, 1 user, load average: 0.06, 0.03, 0.01 16:18:08 up 41 days, 23:11, 3 users, load average: 0.63, 0.18, 0.10
ispconfig-duncan | CHANGED | rc=0 >> py.criprod.isima.fr | CHANGED | rc=0 >>
18:15:48 up 15 days, 1:00, 1 user, load average: 0.02, 0.02, 0.00 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) - role: debug # le rôle debug sera exécuté par le playbook
* shell tags: debug # le tag debug sera ajouté à toutes les tâches du role debug
* packages my-variable: "pipo" # il ya d'autres endroit où mettre les variables
* users / groups # à suivre ...
* déploiement (git) - role: vault-cli # le rôle vault-cli sera exécuté par le playbook
* services tags: vault # le tag vault sera ajouté à toutes les tâches du role vault-cli
```
## playbook ## 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) `--check`
* `--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
[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 ```shell
* via la ligne de commande $ ansible-playbook my-playbook.yml -vvv
* 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)
`-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 [<i class="fa fa-book" aria-hidden="true"></i> filters](https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html)
* acces dynamique
* `ansible-vault` nous on utilise vault by HashiCorp ```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 ## variable & secret
* [var_prompts](https://docs.ansible.com/ansible/latest/user_guide/playbooks_prompts.html) ```yaml
* ceux là devraient être dans un keepass - debug:
* gitlab msg: "{{ lookup('env','PVE_NODE') }}"
* vault ```
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) ```yaml
* [raw](https://docs.ansible.com/ansible/latest/modules/raw_module.html) shell: /usr/bin/foo
* [command](https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module) register: foo_result
* [shell](https://docs.ansible.com/ansible/latest/modules/shell_module.html) 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 ## tags
* loop
* set_fact * `always`
* pre_task * tag spécial exécuté à tous les coups
* when * tags au niveau tâches
* tags * tags au niveau roles
## modules ## modules
...@@ -201,7 +428,7 @@ ansible-playbook ansible/playbooks/ovh/duncan.yml ...@@ -201,7 +428,7 @@ ansible-playbook ansible/playbooks/ovh/duncan.yml
* file * file
* infile * infile
* copy * copy
* template * [<i class="fa fa-book" aria-hidden="true"></i> template](https://docs.ansible.com/ansible/latest/modules/template_module.html)
* package * package
* stat * stat
* get_url * get_url
...@@ -209,18 +436,18 @@ ansible-playbook ansible/playbooks/ovh/duncan.yml ...@@ -209,18 +436,18 @@ ansible-playbook ansible/playbooks/ovh/duncan.yml
* user * user
* systemd * systemd
* pip * pip
* pexpect (require pexcpect) * pexpect (require pexpect)
* https://docs.ansible.com/ansible/latest/modules/template_module.html
## roles ## 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 * mettre à jour `requirements.yml` avec les rôles nécessaires
...@@ -236,20 +463,15 @@ ansible-galaxy install -f -r requirements.yml ...@@ -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 en affectant le path dans le fichier requirements.yml au niveau du role distant
## plugins
* callback
* filter
* lookup
* module_utils
## skeleton ## skeleton
* https://github.com/mrjk/ansible-skel
``` ```
ansible-galaxy init --role-skeleton /path/to/stack/ansible/roles/skeletons/role-with-vagrant gitlab 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 # 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 @@ ...@@ -19,7 +19,7 @@
## vagrant ## vagrant
* Il peut être considéré comme un wrapper d'hyperviseur * il peut être considéré comme un wrapper d'hyperviseur
* VirtualBox * VirtualBox
* libvirt * libvirt
* VMware * VMware
...@@ -70,12 +70,12 @@ Vagrant.configure("2") do |config| ...@@ -70,12 +70,12 @@ Vagrant.configure("2") do |config|
end end
``` ```
Beaucoup de commentaires ... laisser vous guider beaucoup de commentaires ... laisser vous guider
## Box ## Box
* Machines virtuelles préconfigurées (templates) * machines virtuelles préconfigurées (templates)
* [vagrant cloud](https://app.vagrantup.com/boxes/search) * [vagrant cloud](https://app.vagrantup.com/boxes/search)
* [vagrantbox.es](https://www.vagrantbox.es/) * [vagrantbox.es](https://www.vagrantbox.es/)
* mis en cache * mis en cache
...@@ -240,7 +240,7 @@ end ...@@ -240,7 +240,7 @@ end
## conclusion ## 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) * [<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 ...@@ -167,6 +167,7 @@ Stocker le secret directement dans hashicorp vault
$ vault kv put cri/tokens root=$(openssl rand -base64 25) $ vault kv put cri/tokens root=$(openssl rand -base64 25)
``` ```
## SEE ALSO ## SEE ALSO
* [cri/ansible-playbook-vault](https://gitlab.isima.fr/cri/ansible-playbook-vault) * [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> <ul>
<li> <li>
Architecture Architecture
...@@ -65,35 +86,16 @@ ...@@ -65,35 +86,16 @@
</ul> </ul>
<h3>cri</h3> <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> <ul>
<li><a href="cri/devops.html">devops</a></li>
<li> <li><a href="cri/vagrant.html">vagrant</a></li>
<a href="privacy/jnarac.html">je n'ai rien &agrave; cacher</a> <li><a href="cri/ansible.html">ansible</a></li>
<ul> <li><a href="cri/vault.html">vault</a></li>
<li><a href="1337/http.html">http</a></li> <li><a href="cri/pve.html">pve</a></li>
<li><a href="privacy/sovereignty.html">souverainet&eacute;</a></li> <li><a href="cri/terraform.html">terraform</a></li>
<li><a href="privacy/tracking.html">tracking</a></li> <li><a href="cri/stack.html">stack</a></li>
<li><a href="privacy/passwords.html">mots de passes</a></li> <li><a href="cri/gitlab.html">gitlab</a></li>
<li><a href="privacy/tor.html">tor</a></li> <li><a href="cri/my.html">my</a></li>
<li><a href="privacy/tails.html">tails</a></li> <li><a href="cri/openstack.html">openstack</a></li>
<li><a href="privacy/crypto.html">crypto</a></li> <li><a href="cri/criprod.html">criprod</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> </ul>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment