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 1361 additions and 319 deletions
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/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

<!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
......@@ -13,30 +13,31 @@
* racheté par RedHat en octobre 2015
* outils équivalents
* puppet, chief, salt ...
* [puppet](https://puppet.com/), [chef](https://www.chef.io/#/), [SaltStack](https://www.saltstack.com/) ...
## ansible Φ
* idempotence
* héritage
* automatisation
* réutilisabilité
* parallélisation
* automatisation
* idempotence
<br />
#### toute intervention manuelle sur un système est une faute ...
#### toute intervention manuelle sur un système est une faute ...<!-- .element class="fragment" -->
## ... GRAVE!
## ... GRAVE!<!-- .element class="fragment" -->
## ansible
* écrit en python
* python 2 par défaut
* marche bien en python 3 <3
* 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](https://docs.ansible.com/)
[<i class="fa fa-book" aria-hidden="true"></i> ansible doc](https://docs.ansible.com/)
## ansible
......@@ -63,12 +64,12 @@
* 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
* **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)
......@@ -79,74 +80,77 @@
## terminologie
* **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
* peuvent être enrichis
* **handlers**
* similaire aux **tasks** mais appelable à partir d'une **task**
* redémarrage de service par exemple
* 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*
* organiser par groupes
* 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)
[<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]
pvecriprod2.isima.fr
py.criprod.isima.fr
gitlab-runner1.criprod.isima.fr
ansible-test.criprod.isima.fr
[all:vars]
[ovh]
ansible-test.ovh.isima.fr
[criprod:vars]
environment = production
[all:vars]
ansible_python_interpreter = /usr/bin/python3
ansible_user = limosadm
```
## tips ssh
* utilisez ~/.ssh/config
## inventory
```
Host pvecriprod2.isima.fr
User limosadm
IdentityFile ~/.ssh/keys/limosadm
Host ansible-test.criprod.isima.fr
User limosadm
Hostname 192.168.220.243
IdentityFile ~/.ssh/ids/duncan.isima.fr/limosadm/id_rsa
Host py.criprod.isima.fr
Host ansible-test.ovh.isima.fr
User limosadm
IdentityFile ~/.ssh/keys/limosadm
ProxyCommand ssh pvecriprod2.isima.fr -W %h:%p
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
```
$ ansible all --inventory-file=inventory.ini --module-name ping
```shell
$ ansible criprod --inventory-file=inventory.ini \
-a "/usr/bin/uptime"
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"
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
......@@ -159,6 +163,28 @@ gitlab-runner1.criprod.isima.fr | CHANGED | rc=0 >>
```
## 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)
......@@ -180,113 +206,153 @@ my-playbook.yml
```yaml
- name: my-playbook # ce que vous voulez
hosts: criprod # ou all
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
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
```
## playbook
```shell
$ ansible-playbook my-playbook.yml
$ ansible-playbook my-playbook.yml \
--inventory-file=inventory.ini
```
exécute le playbook sur toutes les machines de l'inventaire
* exécute le playbook
* sur toutes les machines définies dans `hosts:`
* en parallèle
```shell
$ ansible-playbook my-playbook.yml --check --diff
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
```
`--check`
simule les tâches à effectuer sans les effectuer (dry-run)
## variables
`--diff`
* nommage
* pas de `-` pas de `.`
* pas de numérique pure
indique ce qui change
```shell
$ ansible-playbook my-playbook.yml -vvv
```
## variables
`-v`, `-vv`, `-vvv`, `-vvvv`
`my-playbook.yml`
pour la verbosité
```yaml
- name: my-playbook
hosts: ovh
remote_user: limosadm
vars:
awesomevar: awesome
```
## playbook
`group_vars/all.yml`
```shell
$ ansible-playbook my-playbook.yml --list-tags
```yaml
coolvar: Coool
```
liste tous les tags disponibles dans le playbook
```shell
$ ansible-playbook my-playbook.yml --tags debug
## 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 }}"
```
n'exécute que les tâches du playbook ayant un tag `debug`
## variables
```shell
$ ansible-playbook my-playbook.yml --skip-tags debug
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
```
exécute toutes les tâches du playbook sauf celles ayant un tag `debug`
```shell
$ ansible-playbook my-playbook.yml --limit=py.isima.fr
## variables
lit une valeur à partir Vault (<strike>`ansible-vault`</strike>)
```yaml
vars_prompt:
- name: "name"
prompt: "what is your name?"
```
exécute toutes les tâches du playbook sur py.isima.fr uniquement
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
* 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)
* 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)
## jinja
## facts
[<i class="fa fa-book" aria-hidden="true"></i> templating](https://docs.ansible.com/ansible-container/container_yml/template.html)
group_vars/all.yml
* valeurs collectées par ansible à l'exécution du playbook
```yaml
my-role: my-awesome-role
- 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 }}"
```
playbook.yml
[<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)
```yaml
roles:
- role: "{{ my-role }}"
```
## 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)
......@@ -296,13 +362,15 @@ utilisable partout (playbook, role, tasks, template)
[<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('/', '-') }}"
"{{ item_path[:4] | replace('/', '-') }}"
```
* renvoie un path
* 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
......@@ -313,165 +381,504 @@ 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> callback](https://docs.ansible.com/ansible/latest/plugins/callback.html)
[<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)
## variable & secret
## task
[<i class="fa fa-book" aria-hidden="true"></i> loop](https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html)
```yaml
- debug:
msg: "{{ lookup('env','PVE_NODE') }}"
- user:
name: "{{ item }}"
state: present
loop:
- testuser1
- testuser2
loop_control:
index_var: key_index
```
lit une valeur à partir d'une variable d'environement
* 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
- debug:
msg: "{{ lookup('hashi_vault', 'secret=secret/hi:value token=xxx url=http://myvault')}}"
- 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
```
lit une valeur à partir Vault (<strike>`ansible-vault`</strike>)
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
vars_prompt:
- name: "name"
prompt: "what is your name?"
- name: get mysqladmin status
shell: mysqladmin status
ignore_errors: True
```
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.
## failed_when
## task
* permet de forcer à stopper l'exécution du playbook
* sur une condition
[<i class="fa fa-book" aria-hidden="true"></i> debug](https://docs.ansible.com/ansible/latest/modules/debug_module.html)
```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
- debug:
msg: "System {{ inventory_hostname }} has uuid {{ ansible_product_uuid }}"
- 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
- shell: somescript.sh >> somelog.txt
- name: redirige la sortie de somescript.sh dans somelog.txt
shell: somescript.sh >> somelog.txt
args:
chdir: somedir/
chdir: somedir/ifcon
creates: somelog.txt
```
## task
## 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
shell: /usr/bin/foo
register: foo_result
ignore_errors: True
- name: le service pam est il lancé
shell: "ps -aux | grep pam"
register: pam_status
```
[<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)
dans une liste
```yaml
- user:
name: "{{ item }}"
state: present
- name: les services sshd, systemd, dbus sont ils lancés
shell: "ps -aux | grep {{ item }}"
register: services_status
loop:
- testuser1
- testuser2
- sshd
- systemd
- dbus
```
* 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
* ...
## register (<i class="fa fa-gift" aria-hidden="true"></i>)
## task
[<i class="fa fa-book" aria-hidden="true"></i> Return Values](https://docs.ansible.com/ansible/latest/reference_appendices/common_return_values.html)
[<i class="fa fa-book" aria-hidden="true"></i> when](https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.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"
]
}
```
[<i class="fa fa-book" aria-hidden="true"></i> conditions](https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html)
## register (<i class="fa fa-gift" aria-hidden="true"></i>)
afficher l'output
```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
- name: afficher la sortie de la commande
debug:
msg: pam_status.stdout
```
[<i class="fa fa-book" aria-hidden="true"></i> set_fact](https://docs.ansible.com/ansible/latest/modules/set_fact_module.html)
itérer sur une liste
pre_task
```yaml
- name: afficher la sortie de chaque commande
debug:
msg: "{{ services_status.results[item].stdout }}"
loop: "{{ range(0, 3)|list }}"
```
[<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)
ou
```yaml
- name: afficher la sortie de chaque commande
debug:
msg: "{{ item.stdout }}"
loop: "{{ services_status.results }}"
```
## tags
## 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
```
* `always`
* tag spécial exécuté à tous les coups
* tags au niveau tâches
* tags au niveau roles
If a task fails or is skipped, **the variable still is registered with a failure or skipped status**
## modules
* file
* infile
* copy
* [<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)
* package
* stat
* get_url
* unarchive
* user
* systemd
* pip
* pexpect (require pexpect)
* [<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/)
## ansible.cfg
### 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
```
## remote roles
* utilisation dans un playbook
* mettre à jour `requirements.yml` avec les rôles nécessaires
`requirements.yml`
* récupérer les rôles
```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 -p ansible/roles/public
$ ansible-galaxy install -f -r requirements.yml
```
ou
## [<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-galaxy install -f -r requirements.yml
## 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
```
en affectant le path dans le fichier requirements.yml au niveau du role distant
## skeleton
## [<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
```
ansible-galaxy init --role-skeleton /path/to/stack/ansible/roles/skeletons/role-with-vagrant gitlab
```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-github" aria-hidden="true"></i> mrjk/ansible-skel](https://github.com/mrjk/ansible-skel)
[<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
* https://docs.ansible.com/ansible/latest/dev_guide/developing_plugins.html
* https://docs.ansible.com/ansible/latest/dev_guide/developing_modules.html
[<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)**
......@@ -11,23 +11,23 @@
* automatiser (automation)
* suivre (monitoring)
* tester: automatiquement
* accélérer: cycle courts à prioriser
* accélérer: cycles 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
* autonomiser les dev et idéalement les users
## De nombreux outils
![DevOps tools](images/devops-tools.png "DevOps tools")
## les outils du dialogue
......@@ -37,10 +37,14 @@
* [vault](vault.html)
* [proxmox](pve.html)
* [terraform](terraform.html)
* [stack](stack.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)
......
# manifeste
## 80 colonnes par lignes max
!["80 colonnes"](images/80columns.jpg "80 colonnes")
# monitoring
# OpenStask
# OpenStack
* mise à jour
......
# Proxmox
## aka pve
## Proxmox
* 10 ans
## interfacer avec le LDAP
# https://forum.proxmox.com/threads/how-to-transfer-large-iso-to-proxmox.455/
iptables -t nat -I PREROUTING -d 37.59.57.58 -p tcp --dport 443 -j DNAT --to-destination 37.59.57.58:8006
apt install iptables-persistent
service iptables save
# https://pve.proxmox.com/wiki/HTTPS_Certificate_Configuration_(Version_4.x,_5.0_and_5.1)
# https://pve.proxmox.com/wiki/Storage:_Directory
vi /etc/pve/storage.cfg
dir: local
path /var/lib/vz
vgname pve
content iso,vztmpl,backup,rootdir,images
service pvestatd restart
# https://pve.proxmox.com/wiki/Cloud-Init_FAQ
Hardware > Add > loudInit Drive
SCSI / 0 / local
# https://pve.proxmox.com/wiki/Cloud-Init_Support
# create local-lvm (https://pve.proxmox.com/wiki/Storage)
# download the image
wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img
# create a new VM
qm create 9001 --memory 2048 --net0 virtio,bridge=vmbr0
# import the downloaded disk to local-lvm storage
qm importdisk 9001 bionic-server-cloudimg-amd64.img local
# finally attach the new disk to the VM as scsi drive
qm set 9001 --scsihw virtio-scsi-pci --scsi0 local:vm-9001-disk-0
qm set 9000 --ide2 local:cloudinit
qm set 9000 --boot c --bootdisk scsi0
qm set 9000 --serial0 socket --vga serial0
qm template 9000
Deploying Cloud-Init Templates
qm clone 9000 123 --name isp
qm set 123 --sshkey /root/limosadm.pub
qm set 123 --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1
......@@ -5,22 +5,45 @@
aka **B** rew **W** ired **S** tack
## requirement
## soyons honnête!
* proxmox aka pve
* ansible
* terraform
* [proxmox-provisionner](https://github.com/Telmate/terraform-provider-proxmox)
* [proxmox-api](https://github.com/Telmate/proxmox-api-go)
* du love <3
Tout repose sur
* [proxmox-provisionner - pulse](https://github.com/Telmate/terraform-provider-proxmox/pulse)
* [proxmox-api - pulse](https://github.com/Telmate/proxmox-api-go/pulse)
## soyons honnête
et sur les produits [HashiCorp](https://github.com/hashicorp)
Tous repose sur
* [proxmox-provisionner - pulse](https://github.com/Telmate/terraform-provider-proxmox/pulse)
* [proxmox-api - pulse](https://github.com/Telmate/proxmox-api-go/pulse)
## Directory Layout
```shell
+ ansible/
+ plugins/ # utilisé pour le callback anstomlog <3
+ roles/ # roles ansible (commun)
+ bin/ # toutes les commandes de la stack
+ docs/ # documentation
+ packer/ # préparation des templates pve
+ workspaces/ # répertoire pour les workspaces
+ wk/ # répertoire du workspace wk
+ ansible/ # vars et playbooks ansible de wk
+ terraform/ # ressources terraform de wk
- config.yml # config de wk
- ssh_config # config ssh de wk
```
# GROUND0
## PRA
Après la catastrophe on a remnté
- un réseau opérationnel
- des noeuds proxomox non configurés (fresh install)
- un serveur vault restauré
- une copie du repo de la stack et des rôles minimaux nécessaires
- pve
- gitlab
- backuppc
- la sauvegarde de tous les services à restaurer avec backuppc
## PCA / PRA
# INP/ISIMA / LIMOS
## Bienvenue
## DOC
* https://doc.isima.fr
* https://doc.cri.isima.fr (accès restreint aux membres du CRI)
## SUPPORT
* https://support.isima.fr
* https://dsi.uca.fr/assistance
* https://support.uca.fr
* DIL INP
### CRI
* 7 membres infra / services / support (A115/A109)
* 1 membres dédié projets recherche (F201)
* 1 membres dédié HPC
* 1 membres dédié électronique
## BATIMENTS
## AUTHENTIFICATION
* identifiants UCA
* 1 login
* 1 mot de passe
* à changer
* https://ent.uca.fr/compte/
* RH
* scola
* annuaire synchrone à l'ISIMA/LIMOS
* Active Directory (DC + rodc + OpenLdap synchronisé)
* compte uca pour TOUS les services
* comptes invités locaux
* groupes utilisateurs
* permissions sur les services
* changement de mot de passe via l'ENT UCA immédiat partout
* identifiants UCA pour tous les services UCA / ISIMA / LIMOS
## MAIL
* @isima.fr, @limos.fr
* une seule boite pour 2 alias
* webmail SOGO
* https://mail.isima.fr === https://mail.limos.fr
* agenda
* carnet d'adresse
* possibilité de forward
* @etu.uca.fr
* alias @etu.isima.fr
* @uca.fr
* mail universitaire
* boite distinct de @[isima|limos].fr
* @clermont-auvergne-inp.fr
* pour le personnel INP
* @cnrs.fr
* pour le personnel CNRS
## HOME
* dirs.local.isima.fr
* nfs + kerberos
* monter sur perso.isima.fr
* ssh ucausername@dirs.local.isima.fr
* SEUL CE QUI EST ICI EST EN LIEU SUR!
## FIXE ET LAPTOP
* gérer par le CRI et avec accès au réseau ISIMA/LIMOS
* un fix + un laptop pour les enseignants chercheurs
* un fixe ou un laptop pour les doctorant
* machines perso, téléphone, tablette
* connexion WIFI via https://eduroam.org/
* identifiant UCA
* sous windows
* P:// monte votre home de dirs
* SEUL ENDROIT SUR POUR SAUVER CES DONNEES
* TOUS LES POSTES SONT CHIFFRES
* sans aucune exception fixe et laptop
* possibilité de prêt selon les stocks
## MACHINES PEDA
* PC Triple boot
* Windows
* Kubuntu
* OS exam
* PC spécialisés
* Physique
* Robotique
* Electronique
* Tx
* GONA DIE!
* Accès libre
## ACCES SERVEURS VMS
* ssh
* guacamole
* xRDP
## SERVEURS PEDA
* serveurs UNIX
* ADA / Turing
* shared monte votre home de dirs
* SEUL ENDROIT SUR POUR SAUVER CES DONNEES
* serveurs Windows
* TSE1
* P:// monte votre home de dirs
* SEUL ENDROIT SUR POUR SAUVER CES DONNEES
* résintallables à tout moment
* résintallés le 7 juillet 2023
* AUCUN BACKUP!
## VMs PEDA
* accessible via
* ssh
* lire les messages
* guacamole
* problème de raccourcis clavier
* xRDP
## SERVEURS HPC
* Helene Toussaint
* helen.toussaint@limos.fr
* https://hpc.isima.fr
## SERVICES ISIMA/LIMOS
* https://hedgedoc.isima.fr
* https://guacamole.isima.fr
* https://my.isima.fr
* vpn
* cri (accès aux seuls membres)
* profs (enseignants / chercheurs et administration)
* étudiants
* marche / arrêt de VMs péda
* https://gitlab.isima.fr (péda)
* https://gitlab.limos.fr (recherche)
## SERVICES UCA
## SERVEURS PROJETS
## IMPRESSIONS
## RESEAU
## HYPERVISION
\ No newline at end of file
......@@ -14,7 +14,6 @@
* [<i class="fa fa-gavel" aria-hidden="true"></i> The MIT License](https://github.com/hashicorp/vagrant/blob/master/LICENSE)
* outil en ligne de commande
* se voit dans l'hyperviseur utilisé
## vagrant
......@@ -30,19 +29,13 @@
## Installation
pré-requis
VirtualBox (versions 4.0.x, 4.1.x, 4.2.x, 4.3.x, 5.0.x, 5.1.x, 5.2.x)
```
$ sudo apt install virtualbox
```
via gem
```
$ sudo apt install rubygems-integration
$ sudo gem install vagrant
```
via apt
install via apt (plus distribué via RubyGem)
```
$ sudo apt install vagrant
......@@ -76,8 +69,6 @@ beaucoup de commentaires ... laisser vous guider
## Box
* machines virtuelles préconfigurées (templates)
* [vagrant cloud](https://app.vagrantup.com/boxes/search)
* [vagrantbox.es](https://www.vagrantbox.es/)
* mis en cache
* nommage à la github "développeur/Box"
......@@ -87,10 +78,23 @@ $ vagrant box add "http://aka.ms/vagrant-win7-ie11"
$ vagrant box list
$ vagrant box remove "ubuntu/xenial64"
```
* [vagrant cloud](https://app.vagrantup.com/boxes/search)
* [vagrantbox.es](https://www.vagrantbox.es/)
## Creating Box
* [Creating a Base Box](https://www.vagrantup.com/docs/boxes/base.html)
* [<i class="fa fa-github" aria-hidden="true"></i> veewee](https://github.com/jedi4ever/veewee)
* [<i class="fa fa-github" aria-hidden="true"></i> How to Create a CentOS Vagrant Base Box](https://github.com/ckan/ckan/wiki/How-to-Create-a-CentOS-Vagrant-Base-Box)
* [packer by HashiCorp](https://packer.io/)
* [<i class="fa fa-book"></i> Creating windows base images using Packer and Boxstarter](http://www.hurryupandwait.io/blog/creating-windows-base-images-for-virtualbox-and-hyper-v-using-packer-boxstarter-and-vagrant)
* [<i class="fa fa-github"></i> joefitzgerald/packer-windows](https://github.com/joefitzgerald/packer-windows)
## cycle de vie
......@@ -104,6 +108,7 @@ $ vagrant suspend
$ vagrant reload
$ vagrant destroy #--force
```
se voit dans l'hyperviseur utilisé
## réseau
......@@ -215,6 +220,13 @@ end
```
## Vagrant VS Docker
[<i class="fa fa-gitlab"></i> vimazeno/reveal-prez](https://gitlab.isima.fr/vimazeno/reveal-prez)
[<i class="fa fa-gitlab"></i> vimazeno/affproj](https://gitlab.isima.fr/vimazeno/affproj)
## provisioning
via [ansible](ansible.html)
......
# vault
## Vault en bref!
![vault](images/vault.png "vault")<!-- .element width="30%" -->
![vault](../cri/images/vault.png "vault")<!-- .element width="30%" -->
**By HashiCorp**
#### Des secrets, des apps, des tokens, des équipes, un séquestre
## Installation
## Vault
* téléchargement d'un binaire
* By HashiCorp
* [écrit en go](https://github.com/hashicorp/hcl)
* cross plateform
* [hcl](https://github.com/hashicorp/hcl)
* intégration avec [consul](https://www.consul.io) & [terraform](https://www.terraform.io/)
* [auditable](https://www.vaultproject.io/docs/commands/audit/enable.html)
* [documenté](https://www.vaultproject.io/docs/)
* ... couteau suisse
* https://releases.hashicorp.com/vault/
* décompresser dans /usr/local/bin
* configurer les permissions
* créer un service systemd
## Vault
* Un binaire [vault](https://releases.hashicorp.com/vault/) qui fait
* serveur
* [<i class="fa fa-book" aria-hidden="true"></i> api](https://www.vaultproject.io/api/overview)
* UI web
* cli
```shell
$ export $VAULT_ADDR=https://10.0.0.1
```
## Configuration
* /etc/vault/vault.hcl
`/etc/vault/vault.hcl`
```
backend "file" {
......@@ -26,152 +41,129 @@ backend "file" {
ui = true
disable_mlock = true
listener "tcp" {
address = "10.0.0.1:8200"
tls_disable = 1
address = "10.0.0.1:443"
tls_cert_file = "/etc/certs/vault.crt"
tls_key_file = "/etc/certs/vault.key"
tls_disable = 0
}
```
## Secret engine
## initialisation SSS
### Shamir's Secret Sharing
```shell
$ vault operator init -key-shares=3 -key-threshold=2
```
```shell
Unseal Key 1: 6gAO3lmAhIaHzDAdkK256g2B2Dpeqy+z4jqQCJBID3d8
Unseal Key 2: TO7DDRQXSPC3IQylPEBPjPGAGAGMzjEkjT/FL62m7UUd
Unseal Key 3: CYfEbt83jYsQFcSErHT4Y5NCsrEtfFUE6tjQZKfP632K
## KV2
Initial Root Token: s.78MykQO2b5qcy03rtoNwmhr1
```
vault login token=<root-token>
vault secrets enable -path=cri kv
vault kv enable-versioning cri/ # kv2
```
Vault initialized with 3 key shares and a key threshold of 2. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 2 of these keys to unseal it
before it can start servicing requests.
* les secrets sont versionnés
* il est possible d'utiliser PATCH et pas seulement PUT
Vault does not store the generated master key. Without at least 2 key to
reconstruct the master key, Vault will remain permanently sealed!
```
## Authentification
* par token
* root
* d'application
!["authentification"](../cri/images/vault-auth.png "authentification")
* par ldap
* en réalité génère un token dans ~/.vault-token contenant
## Authentification
## LDAP
par token
```
$ vault write auth/ldap/config \
url="ldaps://samantha.local.isima.fr" \
userattr="sAMAccountName" \
userdn="dc=local,dc=isima,dc=fr" \
groupattr="cn" \
groupfilter="(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={{.UserDN}}))" \
groupdn="ou=GROUPES_LOCAUX,dc=local,dc=isima,dc=fr" \
binddn="cn=vault,ou=Comptes de Services,dc=local,dc=isima,dc=fr" \
bindpass="secret" \
insecure_tls="false" \
starttls="true"
```shell
$ vault login token=<root-or-app-token>
```
equivalent à
## Policy
```shell
$ export VAULT_TOKEN token=<root-or-app-token>
```
/etc/vault/cri.hcl
par ldap
```shell
$ vault login -method=ldap username=mazenovi
```
# Write and manage secrets in key-value secret engine
path "secret/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# To enable secret engines
path "sys/mounts/*" {
capabilities = [ "create", "read", "update", "delete" ]
}
path "secret/data/cri/*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
stocke le token dans `~/.vault-token` et `$VAULT_TOKEN`
path "cubbyhole/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
```
## Policy (ACL)
```
$ vault policy write cri /etc/vault/cri.hcl
path "cri/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
```
écriture
## Map policy and ldap group
```shell
$ vault policy write cri `/etc/vault/cri.hcl`
```
application à un groupe ldap
```shell
$ vault write auth/ldap/groups/cri policies=cri
```
création de token à partir de la policy
## Utilisation
* le même binaire à télécharger
* cross plateforme
* deux variables d'environnement
* $VAULT_ADDR=https://vault.isima.fr
* $VAULT_TOKEN
ou
* l'[api](https://www.vaultproject.io/api/overview)
## Workflow
```
$ vault login -method=ldap username=vimazeno
$ vault secrets list
$ vault list cri/
$ vault kv get cri/tokens
$ vault kv get cri/tokens # à chaque put on écrase les entrées qu'on ne réécrit pas
$ vault kv get cri/tokens -format=json
$ vault kv get cri/tokens -format=json | jq .data
$ vault kv get cri/tokens -format=json | jq .data.password
$ vault kv put cri/tokens root=pipo2
$ vault kv patch cri/tokens root1=pipo1
$ vault delete cri/tokens
```shell
$ vault token create -policy=cri
```
## création de token
```
$ vault policy write vault/apps/my.hcl
$ vault token create -policy=my
```
## [<i class="fa fa-book" aria-hidden="true"></i> Secrets engines](https://www.vaultproject.io/docs/secrets/)
!["secrets engines"](../cri/images/vault-secrets-engines.png "secrets engines")
## token et ci/cd
* on teste en local avec ses droits via ldaps
* on génère un token en variable de CI/CD pour autoriser l'appli à lire des secrets
## workflow
```shell
$ vault secrets list
$ vault kv list cri/
$ vault kv get cri/test
$ vault kv get -format=json cri/test
$ vault kv get -format=json cri/test | jq .data
$ vault kv get -format=json cri/test | jq .data.data.root
$ vault kv put cri/test password2=$(date | sha256sum)
$ vault kv patch cri/test password1=$(date | sha256sum)
$ vault delete cri/test
```
## Générer un secret
Un secret robuste en ligne de commande se génère avec la commande `openssl` comme suit
```
$ openssl rand -base64 256
```
## avec ansible
Stocker le secret directement dans hashicorp vault
* lookup natif [hashi_vault](https://docs.ansible.com/ansible/latest/plugins/lookup/hashi_vault.html)
* lecture uniquement
* pas de support natif pour kv2 à ce jour
```
$ vault kv put cri/tokens root=$(openssl rand -base64 25)
```
* module "community" [hashivault](https://github.com/TerryHowe/ansible-modules-hashivault)
* Reading and Writing
* supporte kv2
* Initialization, Seal, and Unseal
* Policy
* User Management
## SEE ALSO
## UI
* [cri/ansible-playbook-vault](https://gitlab.isima.fr/cri/ansible-playbook-vault)
!["UI"](../privacy/images/vault/web.png "UI")
* [Vault - Getting started](https://learn.hashicorp.com/vault/?track=getting-started#getting-started)
* [consul](https://www.consul.io/)
!["carnets mots de passe"](../privacy/images/vault/password_management.jpg "carnets mots de passe")<!-- .element width="80%" -->