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
Select Git revision
  • master
  • prez
2 results

Target

Select target project
  • vimazeno/blog.limos.fr
  • matrossevi/blog.limos.fr
  • borlonjo/blog.limos.fr
3 results
Select Git revision
  • master
1 result
Show changes
Showing
with 2150 additions and 0 deletions
content/slides/cri/images/vault-ci.png

30.9 KiB

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

29.5 KiB

content/slides/cri/images/vault.png

42.1 KiB

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