From 1e0883aa8143ec61243ae171f29e4a3e345814c3 Mon Sep 17 00:00:00 2001 From: Vincent Mazenod <vmazenod@gmail.com> Date: Thu, 24 Jan 2019 21:49:21 +0100 Subject: [PATCH] ansible --- content/slides/cri/md/ansible.md | 265 ++++++++++++++++++++++--------- 1 file changed, 187 insertions(+), 78 deletions(-) diff --git a/content/slides/cri/md/ansible.md b/content/slides/cri/md/ansible.md index fd46ebc..472ca93 100644 --- a/content/slides/cri/md/ansible.md +++ b/content/slides/cri/md/ansible.md @@ -434,19 +434,19 @@ conditions jinja, à la python: * not, is, empty, in ... -## task +## 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 +- name: get mysqladmin status shell: mysqladmin status ignore_errors: True ``` -## task +## failed_when * permet de forcer à stopper l'exécution du playbook * sur une condition @@ -457,6 +457,8 @@ conditions jinja, à la python: 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` @@ -482,7 +484,7 @@ conditions jinja, à la python: - name: redirige la sortie de somescript.sh dans somelog.txt shell: somescript.sh >> somelog.txt args: - chdir: somedir/ + chdir: somedir/ifcon creates: somelog.txt ``` @@ -514,6 +516,8 @@ dans une liste ## 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, @@ -534,57 +538,52 @@ dans une liste } ``` + +## 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 ``` - -## register (<i class="fa fa-gift" aria-hidden="true"></i>) +itérer sur une liste ```yaml -- name: - shell: mysqladmin status - register: mysql_status - ignore_errors: True +- name: afficher la sortie de chaque commande + debug: + msg: "{{ services_status.results[item].stdout }}" + loop: "{{ range(0, 3)|list }}" ``` +ou + ```yaml -- name: - shell: mysqladmin status - register: mysql_status - when: False +- name: afficher la sortie de chaque commande + debug: + msg: "{{ item.stdout }}" + loop: "{{ services_status.results }}" ``` -* If a task fails or is skipped, **the variable still is registered with a failure or skipped status** - -## [<i class="fa fa-book" aria-hidden="true"></i> set_fact](https://docs.ansible.com/ansible/latest/modules/set_fact_module.html) +## register (<i class="fa fa-gift" aria-hidden="true"></i>) ```yaml -criprod: - pvecriprod1: - api_users: - - proxmoxapi - - vimazeno +- name: register foo + shell: echo "foo" + register: txt ``` ```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) }}" +- name: register bar + shell: echo "bar" + register: txt + when: False ``` -[<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) +If a task fails or is skipped, **the variable still is registered with a failure or skipped status** ## modules @@ -610,52 +609,43 @@ criprod: * [<i class="fa fa-book" aria-hidden="true"></i> ...](https://docs.ansible.com/ansible/latest/modules/modules_by_category.html) -## tags - -tags au niveau tâches - -```yaml -- name: s'assurer que le fichier user.cfg existe - file: - dest: /etc/pve/user.cfg - state: touch - tags: [pve-users] -``` - -tags au niveau roles à l'inclusion dans le playbook +## handlers ```yaml -roles: + handlers: + - name: restart apache + service: + name: apache2 + state: restarted + listen: "restart apache" - - role: debug - tags: debug + tasks: + - name: enable some apache modules + apache2_module: + state: present + name: "{{ item }}" + notify: restart apache ``` -`always` tag spécial exécuté à tous les coups +## pre / post tasks -## playbook +```yaml +pre_tasks: + - name: update sources + apt: + update_cache: yes + tags: [base] -```shell -$ ansible-playbook my-playbook.yml --list-tags -``` +... -liste tous les tags disponibles dans le playbook +post_tasks: -```shell -$ ansible-playbook my-playbook.yml --tags debug +... ``` -n'exécute que les tâches du playbook ayant un tag `debug` - -```shell -$ ansible-playbook my-playbook.yml --skip-tags debug -``` - -exécute toutes les tâches du playbook sauf celles ayant un tag `debug` - -## playbook +## dry run ```shell $ ansible-playbook my-playbook.yml --check --diff @@ -670,7 +660,7 @@ simule les tâches à effectuer sans les effectuer (dry-run) indique ce qui change -## playbook +## verbosity ```shell $ ansible-playbook my-playbook.yml -vvv @@ -681,7 +671,7 @@ $ ansible-playbook my-playbook.yml -vvv pour la verbosité -## playbook +## limit ```shell $ ansible-playbook my-playbook.yml --limit=py.isima.fr @@ -689,6 +679,10 @@ $ 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 @@ -711,29 +705,52 @@ exécute toutes les tâches du playbook sur py.isima.fr uniquement ``` +## 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-book" aria-hidden="true"></i> debops](https://docs.debops.org/en/master/) +* [<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 ``` -ansible-galaxy init --role-skeleton /path/to/stack/ansible/roles/skeletons/role-with-vagrant gitlab -``` -[<i class="fa fa-gitlab" aria-hidden="true"></i>ansible/roles/skeletons/role-with-vagrant](https://gitlab.isima.fr/cri/stack/tree/master/ansible/roles/skeletons/role-with-vagrant) +* dev -## remote roles +```shell +$ ./bin/setup +$ source ./.venv/bin/activate +$ vagrant up +``` + +* utilisation dans un playbook `requirements.yml` ```yaml -- name: vault-server - src: git+ssh://git@gitlab.isima.fr/cri/ansible-playbook-vault.git - path: ./ansible/roles/remotes +- name: vault + src: git+ssh://git@gitlab.isima.fr/cri/ansible-role-vault.git + path: ./roles/remotes ``` ``` @@ -741,6 +758,74 @@ $ ansible-galaxy install -f -r requirements.yml ``` +## 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] +``` + +tags au niveau roles à l'inclusion dans le playbook + +```yaml +roles: + + - role: debug + tags: debug +``` + +`always` tag spécial exécuté à tous les coups + + +## tags + +```shell +$ ansible-playbook my-playbook.yml --list-tags +``` + +liste tous les tags disponibles dans le playbook + +```shell +$ ansible-playbook my-playbook.yml --tags debug +``` + +n'exécute que les tâches du playbook ayant un tag `debug` + +```shell +$ ansible-playbook my-playbook.yml --skip-tags debug +``` + +exécute toutes les tâches du playbook sauf celles ayant un tag `debug` + + +## [<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 @@ -760,8 +845,32 @@ become_user: root become_method: sudo ``` -[<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> 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 -- GitLab