<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Archives des Ansible - Xavki</title>
	<atom:link href="https://xavki.blog/category/ansible/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Open your Sources..</description>
	<lastBuildDate>Sat, 06 Nov 2021 16:55:43 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Comment installer la stack de monitoring prometheus/grafana avec ansible ?</title>
		<link>https://xavki.blog/comment-installer-la-stack-de-monitoring-prometheus-grafana-avec-ansible/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Sat, 06 Nov 2021 16:55:11 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<guid isPermaLink="false">https://xavki.blog/?p=1328</guid>

					<description><![CDATA[<p><img width="1920" height="1080" src="https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p.jpg" class="attachment- size- wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" fetchpriority="high" srcset="https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p.jpg 1920w, https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p-300x169.jpg 300w, https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p-1024x576.jpg 1024w, https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p-768x432.jpg 768w, https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p-1536x864.jpg 1536w, https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p-624x351.jpg 624w" sizes="(max-width: 1920px) 100vw, 1920px" />Vous le savez surement mais j&#8217;aime beaucoup ansible par sa simplicité. Mais pas seulement, il y a aussi sa communauté qui lui permet de partager un grande nombre de rôles notamment via galaxy. On ne va pas en profiter aujourd&#8217;hui... <a href="https://xavki.blog/comment-installer-la-stack-de-monitoring-prometheus-grafana-avec-ansible/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/comment-installer-la-stack-de-monitoring-prometheus-grafana-avec-ansible/">Comment installer la stack de monitoring prometheus/grafana avec ansible ?</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="1920" height="1080" src="https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p.jpg" class="attachment- size- wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" loading="lazy" srcset="https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p.jpg 1920w, https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p-300x169.jpg 300w, https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p-1024x576.jpg 1024w, https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p-768x432.jpg 768w, https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p-1536x864.jpg 1536w, https://xavki.blog/wp-content/uploads/2021/11/wallhaven-lm7x5p-624x351.jpg 624w" sizes="auto, (max-width: 1920px) 100vw, 1920px" />
<p>Vous le savez surement mais j&#8217;aime beaucoup ansible par sa simplicité. Mais pas seulement, il y a aussi sa communauté qui lui permet de partager un grande nombre de rôles notamment via galaxy. On ne va pas en profiter aujourd&#8217;hui mais souvent c&#8217;est un bon moyen de voir comment on installe et configure une technologie. Voir de se rendre compte de la complexité ou non de la chose et même si à la fin on ne veut pas forcément le faire avec ansible cela reste une sorte de doc à suivre.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="ANSIBLE - Tutos &amp; Formation  : automatiser vos configurations" width="625" height="352" src="https://www.youtube.com/embed/videoseries?list=PLn6POgpklwWoCpLKOSw3mXCqbRocnhrh-" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Le monitoring est un point indispensable de notre métier. Il a nettement évolué au cours de la dernière décennie, notamment avec la montée en force de la conteneurisation et du cloud. Ainsi le monitoring a dû se mettre à la page pour adapter une configuration dynamique. On ne peut plus se permettre de rentrer les machines à monitorer une à une.</p>



<p>Je vous propose de joindre l&#8217;utile à l&#8217;agréable et vous allez prendre, j&#8217;espère, un peu de plaisir à faire du ansible tout en découvrant la stack prometheus, grafana et les exporter. Bonne <a href="https://xavki.blog/ansible-tutoriaux-francais/">formation ansible à toutes et à tous</a> !! </p>



<p>Vous pouvez retrouver la formation prometheus/grafana and Co ici :</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-xavki wp-block-embed-xavki"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="DtFBQxIfyl"><a href="https://xavki.blog/prometheus-grafana-tutoriaux-francais/">Prometheus/Grafana : tutoriaux français</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="« Prometheus/Grafana : tutoriaux français » &#8212; Xavki" src="https://xavki.blog/prometheus-grafana-tutoriaux-francais/embed/#?secret=nwLUU9i6i5#?secret=DtFBQxIfyl" data-secret="DtFBQxIfyl" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<h2 class="wp-block-heading">La structure de nos rôles</h2>



<p>Alors avec ansible, c&#8217;est un exercice assez intéressant <strong>pour débuter</strong>. Nous allons principalement avoir 3 rôles : node exporter, prometheus et grafana. Ce découpage est intéressant car node exporter doit être installé sur toutes les machines pour remonter les métriques et les deux autres sur une seule machine, le noyau central. </p>



<p>Pourquoi découper en deux prometheus et grafana dans 2 rôles différents ? Généralement plus les briques sont fines et plus on peut faire de choses avec ses legos et bien là c&#8217;est le même principe. On se donne le choix d&#8217;un jour pouvoir installer juste un prometheus ou juste un grafana ou encore mieux de partager dans la communauté vos rôles.</p>



<p>Pour l&#8217;inventaire on va partir sur 3 machines pour avoir quelque chose de simple.</p>



<pre class="wp-block-preformatted">all:
  vars:
    ansible_python_interpreter: /usr/bin/python3
  hosts:
    172.17.0.3:
    172.17.0.4:
  children:
    monito:
      hosts:
        172.17.0.2:</pre>



<p>On y retrouve un groupe ALL composé de 3 serveurs dont un fait partie d&#8217;un sous groupe MONITO. Eventuellement on précise que l&#8217;on va utiliser python 3 sur toutes les machines mais cela n&#8217;est plus vraiment nécessaire actuellement.</p>



<p>Et notre playbook ?</p>



<p>La encore on va faire simple, une partie dédiée à node-exporter et l&#8217;autre à la stack de monitoring. Le premier va installer node-exporter sur le groupe ALL  et le second prometheus/grafana sur la machine du groupe monito.</p>



<pre class="wp-block-preformatted">- name: install node exporter
  hosts: all
  become: yes
  roles:
  - node_exporter

- name: install prometheus/grafana
  hosts: monito
  become: yes
  roles:
  - prometheus
  - grafana</pre>



<p>Au passage on passe un become à YES pour jouer l&#8217;installation complète avec une élévation de privilège via sudo.</p>



<h2 class="wp-block-heading">Création du rôle node exporter</h2>



<p>Pour la création de nos rôles on commence systématiquement par utiliser la commande galaxy qui permet de créer la structure de base. Cela évite d&#8217;avoir des trucs sui ne respecteraient pas les standards de ce côté.</p>



<pre class="wp-block-preformatted">ansible-galaxy init roles/node-exporter</pre>



<p>ET donc comme tous les rôles le point d&#8217;entrée se fait par le répertoire tasks et son main.yml. Il va comprendre les tasks suivantes (et des variables que l&#8217;on va définir après) :</p>



<p>1. Vérification de l&#8217;existence ou non du binaire node exporter</p>



<pre class="wp-block-preformatted">- name: check if node exporter exist
  stat:
    path: "{{ node_exporter_bin }}"
  register: __check_node_exporter_present
</pre>



<p>2. Si il existe on va récupérer sa version en la reprenant via le contenu du fichier systemd de node-exporter (ce n&#8217;est pas forcément optimum mais ça marche bien&#8230; on aurait pu passer par le &#8211;version en redirigeant le stderr vers stdout etc).</p>



<pre class="wp-block-preformatted">- name: if node exporter exist get version
  shell: "cat /etc/systemd/system/node_exporter.service | grep Version | sed s/'.*Version '//g"
  register: __get_node_exporter_version
  when: __check_node_exporter_present.stat.exists == true
  changed_when: false</pre>



<p>La variable __get_node_exporter_version permet de stocker la version. Et pour éviter une tâche qui sera toujours avec un changed on passe un changed_when à false. C&#8217;est l&#8217;inconvénient du module shell.</p>



<p>3. Création d&#8217;un utilisateur pour lancer node-exporter.</p>



<pre class="wp-block-preformatted">- name: create node exporter user
  user:
    name: "{{ node_exporter_user }}"
    append: true
    shell: /usr/sbin/nologin
    system: true
    create_home: false
    home: /</pre>



<p>Pour la sécurité, cet utilisateur est nologin, sans home et de type system pour son uid.</p>



<p>4. Création d&#8217;un répertoire de configuration dans /etc/.</p>



<p>J&#8217;ai tendance à le faire pour tous les binaires que l&#8217;on l&#8217;utilise ou non. Au moins on en a un à notre disposition au cas où.</p>



<pre class="wp-block-preformatted">- name: create node exporter config dir
  file:
    path: "{{ node_exporter_dir_conf }}"
    state: directory
    owner: "{{ node_exporter_user }}"
    group: "{{ node_exporter_group }}"</pre>



<p>5. Téléchargement du binaire pour node-exporter</p>



<p>Deux cas de figures se présentent à nous. Soit node exporter n&#8217;existe pas, soit il existe mais n&#8217;est pas dans la bonne version, donc on s&#8217;attache à traiter ces deux cas. Le module unarchive permet à la fois le téléchargement et également le dezip de l&#8217;archive.</p>



<pre class="wp-block-preformatted">- name: download and unzip node exporter if not exist
  unarchive:
    src: "https://github.com/prometheus/node_exporter/releases/download/v{{ node_exporter_version }}/node_exporter-{{ node_exporter_version }}.linux-amd64.tar.gz"
    dest: /tmp/
    remote_src: yes
    validate_certs: false
  when: __check_node_exporter_present.stat.exists == false or not __get_node_exporter_version.stdout == node_exporter_version</pre>



<p>6. Déplacement du binaire dans le PATH</p>



<p>C&#8217;est une habitude et c&#8217;est pratique on ajoute le binaire dans un répertoire du PATH commun.</p>



<pre class="wp-block-preformatted">- name: move the binary to the final destination
  copy:
    src: "/tmp/node_exporter-{{ node_exporter_version }}.linux-amd64/node_exporter"
    dest: "{{ node_exporter_bin }}"
    owner: "{{ node_exporter_user }}"
    group: "{{ node_exporter_group }}"
    mode: 0755
    remote_src: yes
  when: __check_node_exporter_present.stat.exists == false or not __get_node_exporter_version.stdout == node_exporter_version</pre>



<p>Là encore on couvre les deux cas de figure pour être en accord avec la tâche précédente (soit changement de version, soit première installation de node-exporter).</p>



<p>7. Suppression des traces lol</p>



<p>Pour éviter de laisser un /tmp de cochon on clean ce que l&#8217;on vient de faire car on a plus besoin de garder l&#8217;archive.</p>



<pre class="wp-block-preformatted">- name: clean
  file:
    path: /tmp/node_exporter-{{ node_exporter_version }}.linux-amd64/
    state: absent</pre>



<p>8. Installation du service systemd</p>



<p>Avec le module template on va utiliser un template (que l&#8217;on va voir juste après) pour créer le fichier du service systemd de node-exporter.</p>



<pre class="wp-block-preformatted">- name: install service
  template:
    src: node_exporter.service.j2
    dest: /etc/systemd/system/node_exporter.service
    owner: root
    group: root
    mode: 0755
  notify: reload_daemon_and_restart_node_exporter</pre>



<p>On n&#8217;oublie pas de placer un petit notify qui va permetre de pratiquer un systemctl daemon-reload et un restart pour prendre en compte les modifications en cas de changements.</p>



<p>9. Flush du handler</p>



<p>J&#8217;aime bien forcer ansible à jouer les handlers au moment où je le souhaite ou définir le moment le plus tardif où je le fais. Donc on flush le handler.</p>



<pre class="wp-block-preformatted">- meta: flush_handlers</pre>



<p>10. Démarrage de node exporter dans tous les cas</p>



<p>Et à la fin on veut une chose quoiqu&#8217;il arrive : un service node-exporter qui tourne et qui est enable pour prendre en compte un reboot de notre serveur.</p>



<pre class="wp-block-preformatted">- name: service always started
  systemd:
    name: node_exporter
    state: started
    enabled: yes</pre>



<p>11. Les différentes variables par défaut</p>



<p>J&#8217;adore utiliser le répertoire des variables par défaut de notre rôle. Alors voici les variables que je vais défnir (à actualiser si besoin).</p>



<pre class="wp-block-preformatted">node_exporter_version: "1.0.1"
node_exporter_bin: /usr/local/bin/node_exporter
node_exporter_user: node-exporter
node_exporter_group: "{{ node_exporter_user }}"
node_exporter_dir_conf: /etc/node_exporter</pre>



<p>12. Le contenu du main de notre répertoire handlers</p>



<pre class="wp-block-preformatted">- name: reload_daemon_and_restart_node_exporter
  systemd:
    name: node_exporter
    state: restarted
    daemon_reload: yes
    enabled: yes</pre>



<p>13. Le template du service systemd</p>



<p>Rien de fou et le stricte minimum on peut y ajouter éventuellement un restart.</p>



<pre class="wp-block-preformatted">[Unit]
Description=Node Exporter Version {{ node_exporter_version }}
After=network-online.target

[Service]
User={{ node_exporter_user }}
Group={{ node_exporter_group }}
Type=simple
ExecStart={{ node_exporter_bin }}
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target</pre>



<p>Voilà pour node exporter. On a un truc à peu près propre et on peut éventuellement le faire évoluer (multi-system&#8230;).</p>



<h2 class="wp-block-heading">Installation et configuration de prometheus</h2>



<p>Je vous passe la création du rôle dans le répertoire de rôles. On le fait avec la même méthode que pour node-exporter.</p>



<p>Et on déroule de nouveau les tâches pour installer notre prometheus dans les tasks main.yml</p>



<p>1. Installation de prometheus</p>



<p>Alors on peut améliorer cette tâche en définissant une version fixe c&#8217;est toujours un peu mieux et avec sa variable.</p>



<pre class="wp-block-preformatted">- name: update and install prometheus
  apt:
    name: prometheus
    state: latest
    update_cache: yes
    cache_valid_time: 3600</pre>



<p>2. Ajout des arguments à la CLI de prometheus</p>



<p>Pour définir les arguments à passer à notre CLI de prometheus on va utiliser /etc/default/prometheus. Pour créer ce fichier, nous allons le gérer à partir d&#8217;un template pour y ajouter des variables. Et on oublie pas le notify pour disposer d&#8217;un handler qui permettra le restart de prometheus en cas de changement.</p>



<pre class="wp-block-preformatted">- name: prometheus args
  template:
    src: prometheus.j2
    dest: /etc/default/prometheus
    mode: 0644
    owner: root
    group: root
  notify: restart_prometheus</pre>



<p>3. Edition de la configuration de prometheus</p>



<p>Nouveau template pour la création de la configuration de prometheus que nous allons voir juste après.</p>



<pre class="wp-block-preformatted">- name: prometheus configuration file
  template:
    src: prometheus.yml.j2
    dest: "{{ prometheus_dir_configuration }}/prometheus.yml"           
    mode: 0755
    owner: prometheus
    group: prometheus
  notify: reload_prometheus</pre>



<p>En cas de changement on joue un reload de prometheus (plutôt qu&#8217;un restart).</p>



<p>4. Flush du handler</p>



<p>Comme prometheus est normalement toujours démarré à ce stade on peu flusher les handlers (restart ou reload).</p>



<p><code>- meta: flush_handlers</code></p>



<p>5. Prometheus doit toujours être up</p>



<p>Comme pour node-exporter on veut à la fin un prometheus up et enable pour prévoir le reboot de la machine.</p>



<pre class="wp-block-preformatted">- name: start prometheus
  systemd:
    name: prometheus
    state: started
    enabled: yes</pre>



<p>6. Les variables par défaut</p>



<p>Définissons les variables par défaut. On va également définir dedans l&#8217;entête de notre fichier de configuration dans la variables prometheus_var_config, c&#8217;est assez pratique pour faire des modifications.</p>



<pre class="wp-block-preformatted">prometheus_dir_configuration: "/etc/prometheus"
prometheus_retention_time: "365d"
prometheus_scrape_interval: "30s"
prometheus_node_exporter_group: "all"
prometheus_env: "production"
prometheus_var_config:
  global:
    scrape_interval: "{{ prometheus_scrape_interval }}"
    evaluation_interval: 5s
    external_labels:
      env: '{{ prometheus_env }}'
  scrape_configs:
    - job_name: prometheus
      scrape_interval: 15s
      static_configs:
        - targets: ['{{ inventory_hostname }}:9090']</pre>



<p>7. Le template du fichier de configuration prometheus.yml</p>



<p>Voici notre fichier du template de la configuration. Pour traiter strictement notre yaml on y ajoute une entête lstrip_blocks.</p>



<p>On utilise un filtre to_nice_yaml pour aajouter notre variable contenant l&#8217;entête du point précédent.</p>



<p>Et on conditionne un bloc dédié à node-exporter sur activation de la variable prometheus_node_exporter_group.</p>



<p>Grâce aux groupes de ansible ou va lister et boucler sur toutes les machines du groupe défini dans la variable prometheus_node_exporter_group (cela permet de définir un autre nom de groupe que dans notre cas ALL).</p>



<pre class="wp-block-preformatted">#jinja2: lstrip_blocks: "True"
{{ prometheus_var_config | to_nice_yaml(indent=2) }}
{% if prometheus_node_exporter_group %}
- job_name: node_exporter
  scrape_interval: 15s
  static_configs:
  - targets:
{% for server in groups[prometheus_node_exporter_group] %}
    - {{ server }}:9100
{% endfor %}
{% endif %}</pre>



<p>Et enfin le dernier template que l&#8217;on oublie pas, celui des arguments de prometheus (notamment la durée de rétention des métriques dans notre TSDB).</p>



<pre class="wp-block-preformatted"># Set the command-line arguments to pass to the server.
ARGS="--web.enable-lifecycle --storage.tsdb.retention.time={{ prometheus_retention_time }} --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries</pre>



<h2 class="wp-block-heading">Et enfin le rôle Grafana !!!</h2>



<p>On en arrive à la visualisation de nos données, principalement les métriques collectées dans notre prometheus. Alors go on y va. Après avoir crée notre structure de rôles avec la CLI de ansible-galaxy on édite nos tasks.</p>



<p>1. Installation du repository et installation de grafana</p>



<p>On va regrouper les tâches d&#8217;installation.</p>



<pre class="wp-block-preformatted">- name: install gpg
  apt:
    name: gnupg,software-properties-common
    state: present
    update_cache: yes
    cache_valid_time: 3600

- name: add gpg hey
  apt_key:
    url: "https://packages.grafana.com/gpg.key"
    validate_certs: no

- name: add repository
  apt_repository:
    repo: "deb https://packages.grafana.com/oss/deb stable main"
    state: present
    validate_certs: no

- name: install grafana
  apt:
    name: grafana
    state: latest
    update_cache: yes
    cache_valid_time: 3600</pre>



<p>Rien de compliqué donc on passe rapidement.</p>



<p>2. Changement du user d&#8217;admin</p>



<p>Grafana utilise le user admin et le password par défaut admin, c&#8217;est plutôt bien de le changer le plus rapidement possible. On fait cela en passant par son fichier de configuration même si on pouvait le faire par la CLI grafana-cli (mais c&#8217;est l&#8217;occasion de faire un peu de lineinfile pour le découvrir).</p>



<pre class="wp-block-preformatted">- name: change admin user
  lineinfile:
    path: /etc/grafana/grafana.ini
    regexp: "{{ item.before }}"
    line: "{{ item.after }}"
  with_items:
  - { before: "^;admin_user = admin", after: "admin_user = {{ grafana_admin_user }}"}
  - { before: "^;admin_password = admin", after: "admin_password = {{ grafana_admin_password }}"}</pre>



<p>3. Stat et enable de grafana</p>



<p>Sans commentaire</p>



<pre class="wp-block-preformatted">- name: start service grafana-server
  systemd:
    name: grafana-server
    state: started
    enabled: yes
</pre>



<p>Et on peut attendre que Grafana soit up</p>



<p>4. Attente d&#8217;une réponse positive de l&#8217;interface Grafana</p>



<p>Un petit truc sympa mais pas toujours nécessaire, on va attendre une réponse 200 de la page d&#8217;accueil de Grafana. On utilisera un délai d&#8217;attente assez large de 2min.</p>



<pre class="wp-block-preformatted">- name: wait for service up
  uri:
    url: "http://127.0.0.1:3000"
    status_code: 200
  register: __result
  until: __result.status == 200
  retries: 120
  delay: 1</pre>



<p>5. Ajout de notre prometheus comme première datasource</p>



<p>On sait que l&#8217;on a un prometheus juste à côté qui demande à être raccordé à notre grafana, c&#8217;est le moment de le faire. </p>



<pre class="wp-block-preformatted">- name: add prometheus datasource
  grafana_datasource:
    name: "prometheus-local"
    grafana_url: "http://127.0.0.1:3000"
    grafana_user: "{{ grafana_admin_user }}"
    grafana_password: "{{ grafana_admin_password }}"
    org_id: "1"
    ds_type: "prometheus"
    ds_url: "http://127.0.0.1:9090"
  changed_when: false</pre>



<p>Rien de très particulier si ce n&#8217;est que nous utilisons le module grafana qui est bien fonctionnel sur ansible.</p>



<p>6. Téléchargement du dashboard node-exporter</p>



<p>Ensuite on va procéder en deux temps. On télécharge le dashboard dédié à node-exporter.</p>



<pre class="wp-block-preformatted">- name: install node exporter dashboard
  get_url:
    url: https://raw.githubusercontent.com/rfrail3/grafana-dashboards/master/prometheus/node-exporter-full.json
    dest: /var/lib/grafana/node-exporter.json
    mode: '0755'</pre>



<p>7. Activation du dashboard</p>



<p>Ensuite pour activer ce dashboard, nous avons besoin de créer un fichier dans le répertoire de configuration de grafana dans /etc/.</p>



<pre class="wp-block-preformatted">- name: activate dashboard for node exporter
  template:
    src: dashboard-node-exporter.yml.j2
    dest: /etc/grafana/provisioning/dashboards/dashboard-node-exporter.yml
    mode: 0755
  notify: restart_grafana</pre>



<p>Et pour l&#8217;ajouter nous avons besoin de restart en passant par un handler c&#8217;est plutôt mieux.</p>



<p>8. Le handler</p>



<pre class="wp-block-preformatted">- name: restart_grafana
  systemd:
    name: grafana-server
    state: restarted
    enabled: yes
    daemon_reload: yes</pre>



<p>9. Les variables pour notre rôle grafana</p>



<p>Bien sûr à personnaliser.</p>



<pre class="wp-block-preformatted">grafana_admin_user: "xavki"
grafana_admin_password: "password"</pre>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Voilà on a fini nos petits rôles qui ne demande qu&#8217;à être personnalisés et adaptés à vos besoins. Tout cela est perfectible car simplifié pour faciliter la pédagogie et l&#8217;apprentissage. Néanmoins je pense que c&#8217;est une bonne base pour commencer avec cette stack ou encore avac ansible.</p>



<p>Faites vous plaisir, partagez et rejoignez la chaine Xavki !!</p>
<p>L’article <a href="https://xavki.blog/comment-installer-la-stack-de-monitoring-prometheus-grafana-avec-ansible/">Comment installer la stack de monitoring prometheus/grafana avec ansible ?</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ansible, comment générer des clefs SSH et les pousser, organiser un reboot ?</title>
		<link>https://xavki.blog/ansible-comment-generer-des-clefs-ssh-et-les-pousser-organiser-un-reboot/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Mon, 11 Oct 2021 05:54:03 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<guid isPermaLink="false">https://xavki.blog/?p=1301</guid>

					<description><![CDATA[<p><img width="1280" height="720" src="https://xavki.blog/wp-content/uploads/2021/10/ansible-20.png" class="attachment- size- wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" loading="lazy" srcset="https://xavki.blog/wp-content/uploads/2021/10/ansible-20.png 1280w, https://xavki.blog/wp-content/uploads/2021/10/ansible-20-300x169.png 300w, https://xavki.blog/wp-content/uploads/2021/10/ansible-20-1024x576.png 1024w, https://xavki.blog/wp-content/uploads/2021/10/ansible-20-768x432.png 768w, https://xavki.blog/wp-content/uploads/2021/10/ansible-20-624x351.png 624w" sizes="auto, (max-width: 1280px) 100vw, 1280px" />Revenons à ansible un peu dans ce nouvel article avec deux nouvelles utilisations simples et très utiles : la possibilité de créer une clef SSH et de la pousser sur les machines cibles l&#8217;ajout d&#8217;une tâche de reboot (après upgrade... <a href="https://xavki.blog/ansible-comment-generer-des-clefs-ssh-et-les-pousser-organiser-un-reboot/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/ansible-comment-generer-des-clefs-ssh-et-les-pousser-organiser-un-reboot/">Ansible, comment générer des clefs SSH et les pousser, organiser un reboot ?</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="1280" height="720" src="https://xavki.blog/wp-content/uploads/2021/10/ansible-20.png" class="attachment- size- wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" loading="lazy" srcset="https://xavki.blog/wp-content/uploads/2021/10/ansible-20.png 1280w, https://xavki.blog/wp-content/uploads/2021/10/ansible-20-300x169.png 300w, https://xavki.blog/wp-content/uploads/2021/10/ansible-20-1024x576.png 1024w, https://xavki.blog/wp-content/uploads/2021/10/ansible-20-768x432.png 768w, https://xavki.blog/wp-content/uploads/2021/10/ansible-20-624x351.png 624w" sizes="auto, (max-width: 1280px) 100vw, 1280px" />
<p>Revenons à ansible un peu dans ce nouvel article avec deux nouvelles utilisations simples et très utiles :</p>



<ul class="wp-block-list"><li>la possibilité de créer une clef SSH et de la pousser sur les machines cibles</li><li>l&#8217;ajout d&#8217;une tâche de reboot (après upgrade par exemple) et la reprise des tâches où on en était resté</li></ul>



<p>Donc des tâches simples mais courantes d&#8217;un administrateur système sous linux.</p>



<h2 class="wp-block-heading">Créer une clef SSH et la déployer sur votre parc avec Ansible</h2>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE - 20. MODULES SSH : CREATION ET DEPLOIEMENT DE CLEFS" width="625" height="352" src="https://www.youtube.com/embed/NZX80E0Uyao?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Pour faire cela, nous allons réaliser deux tâches différentes avec deux modules disctincts :</p>



<ul class="wp-block-list"><li>openssh_keypair : pour <strong>créer une clef SSH </strong>avec différents paramètres</li><li>authorized_key : pour <strong>déployer la clef publique </strong>dans le fichier authorized_keys de vos utilisateurs</li></ul>



<p>Créer une clef c&#8217;est bien mais en créer une différente sur chaque machine ne sera pas forcément une grande idée. Certes, niveau sécurité vous auriez une infrastructure un peu plus robuste, mais la gestion des clefs risque vite de déborder et devenir insoutenable.</p>



<p>Ainsi, si vous souhaitez passer par ansible pour <strong>créer le jeu de clefs SSH</strong> (privée et publique), je vous invite à faire tourner cette tâche sur le serveur ansible en local.</p>



<p>Ainsi, nous allons jouer une partie de playbook de la manière suivante :</p>



<pre class="wp-block-preformatted">- name: mon premier playbook
  hosts: all
  remote_user: vagrant
  tasks:
  - name: generate SSH key"
    openssh_keypair:
      path: /tmp/xavki
      type: rsa
      size: 4096
      state: present
      force: no
    run_once: yes
    delegate_to: localhost</pre>



<p>J&#8217;ai pris des options de base qui peuvent être renforcées (notammen ajouter une passphrase est indispensable).</p>



<p>Nous utilisons donc le module openssh_keypair en lui demandant de créer un jeu de clefs &#8220;xavki&#8221; de type rsa et de longueur 4096. Et pour faire cela sur le serveur ansible nous lui ajoutons le paramètre delegate_to en mentionnant localhost (run local). Bien sûr ansible souhaite par défaut faire tourner cette tâche pour toutes les machines du groupe all tel que mentionné dans &#8220;hosts&#8221;. C&#8217;est pourquoi avec un run_once à yes, nous allons limiter ce run à une seule itération c&#8217;est à dire pour la première machine du groupe all.</p>



<p>Pour <strong>le déploiement de la clef publique dans le authorized_key</strong>, là encore ansible fournit une module bien pratique.</p>



<pre class="wp-block-preformatted">  - name: Deploy SSH Key
    authorized_key: 
      user: devops
      key: "{{ lookup('file', '/tmp/xavki.pub') }}"
      state: present
    become: yes</pre>



<p>On ajoute un become yes pour que notre user puisse avoir suffisament de droit pour aller dans les homes de tous les utilisateurs. Ensuite on va rechercher le contenu de notre clef publique localement (serveur ansible) avec un lookup de type file et on indique pour cible le user nommé &#8220;devops&#8221;.</p>



<p>Et le tour est joué !!!</p>



<h2 class="wp-block-heading">Comment organiser un reboot après un upgrade avec ansible ?</h2>



<p>Le module reboot de ansible est très utile. Il permet de lancer un reboot intercalé entre différentes taches et de reprendre celles-ci où elles en étaient arrivées avant de lancer le reboot. C&#8217;est bon ça, non ?</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE - 19. MODULE REBOOT : REDEMARRER UN SERVEUR APRES UPGRADE" width="625" height="352" src="https://www.youtube.com/embed/SRD2h5Fh4fA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Alors comment lancer un reboot après une mise à jour du noyau par exemple ou lorsqu&#8217;un reboot est requis ?</p>



<pre class="wp-block-preformatted"> - name: update cache
      apt:
        update_cache: yes
        force_apt_get: yes
        cache_valid_time: 3600

    - name: upgrade général
      apt:
        upgrade: dist
        force_apt_get: yes

    - name: vérification à partir du fichier reboot_required
      register: __reboot_required_file
      stat:
        path: /var/run/reboot-required

    - name: lancement du reboot avec reboot
      reboot:
        msg: "Reboot via ansible"
        connect_timeout: 5
        reboot_timeout: 300
        pre_reboot_delay: 0
        post_reboot_delay: 30
        test_command: uptime
      when: __reboot_required_file.stat.exists</pre>



<p>Dans la première tâche, on lance <strong>une mise à jour du cache apt puis dans la seconde on réalise un dist-upgrade</strong> (dans notre exemple). </p>



<p>Sur debian, lorsque qu&#8217;un reboot est nécessaire, un fichier temporaire est créé dans /var/run/reboot-required. Donc réalisons un stat sur ce fichier pour tester sa présence.</p>



<p>Donc en dernière tâche, on se base sur __reboot_required et sa clef stat.exists pour vérifier la présence de ce fichier. Si celui-ci est là on lance un reboot.</p>



<p>Pour le reboot, on lance aux utilisateurs connectés un message, et on lance un reboot sans attendre avec pre_reboot_delay. On laisse 5min à la machine pour rebooter, puis 30s d&#8217;après reboot et 5 secondes pour se connecter ensuite en SSH dessus. Dans le cas contraire la tâche plantera. Et pour valider cette tâche de reboot on lance enfin un uptime.</p>



<p>Et voilà le tour est joué. Rien de complexe pour deux tâche rudimentaires.</p>



<p>Oubliez pas de venir visiter la chaine Xavki et de vous abonner pour découvrir les plus de 1100 tutoriels.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://xavki.blog/wp-content/uploads/2021/10/ansible-20-1024x576.png" alt="" class="wp-image-1302" srcset="https://xavki.blog/wp-content/uploads/2021/10/ansible-20-1024x576.png 1024w, https://xavki.blog/wp-content/uploads/2021/10/ansible-20-300x169.png 300w, https://xavki.blog/wp-content/uploads/2021/10/ansible-20-768x432.png 768w, https://xavki.blog/wp-content/uploads/2021/10/ansible-20-624x351.png 624w, https://xavki.blog/wp-content/uploads/2021/10/ansible-20.png 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<p>L’article <a href="https://xavki.blog/ansible-comment-generer-des-clefs-ssh-et-les-pousser-organiser-un-reboot/">Ansible, comment générer des clefs SSH et les pousser, organiser un reboot ?</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Le module APT de ansible, un indispensable</title>
		<link>https://xavki.blog/module-apt-ansible-indispensable/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Mon, 19 Apr 2021 17:55:35 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<guid isPermaLink="false">https://xavki.blog/?p=1247</guid>

					<description><![CDATA[<p><img width="1280" height="720" src="https://xavki.blog/wp-content/uploads/2021/04/ansible-18-module-apt.png" class="attachment- size- wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" loading="lazy" srcset="https://xavki.blog/wp-content/uploads/2021/04/ansible-18-module-apt.png 1280w, https://xavki.blog/wp-content/uploads/2021/04/ansible-18-module-apt-300x169.png 300w, https://xavki.blog/wp-content/uploads/2021/04/ansible-18-module-apt-1024x576.png 1024w, https://xavki.blog/wp-content/uploads/2021/04/ansible-18-module-apt-768x432.png 768w, https://xavki.blog/wp-content/uploads/2021/04/ansible-18-module-apt-624x351.png 624w" sizes="auto, (max-width: 1280px) 100vw, 1280px" />Continuons notre formation ansible en apprenant petit à petit les rudiments de ce formidable outil. Bien sûr nous avons encore quelques fondamentaux à découvrir avant de nous lancer dans notre premier TP utile. Celui-ci sera orienté monitoring avec l&#8217;installation d&#8217;une... <a href="https://xavki.blog/module-apt-ansible-indispensable/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/module-apt-ansible-indispensable/">Le module APT de ansible, un indispensable</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="1280" height="720" src="https://xavki.blog/wp-content/uploads/2021/04/ansible-18-module-apt.png" class="attachment- size- wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" loading="lazy" srcset="https://xavki.blog/wp-content/uploads/2021/04/ansible-18-module-apt.png 1280w, https://xavki.blog/wp-content/uploads/2021/04/ansible-18-module-apt-300x169.png 300w, https://xavki.blog/wp-content/uploads/2021/04/ansible-18-module-apt-1024x576.png 1024w, https://xavki.blog/wp-content/uploads/2021/04/ansible-18-module-apt-768x432.png 768w, https://xavki.blog/wp-content/uploads/2021/04/ansible-18-module-apt-624x351.png 624w" sizes="auto, (max-width: 1280px) 100vw, 1280px" />
<p class="has-drop-cap">Continuons <a href="https://xavki.blog/ansible-tutoriaux-francais/">notre formation ansible</a> en apprenant petit à petit les rudiments de ce formidable outil. Bien sûr nous avons encore quelques fondamentaux à découvrir avant de nous lancer dans notre premier TP utile. Celui-ci sera orienté monitoring avec l&#8217;installation <a href="https://xavki.blog/prometheus-grafana-tutoriaux-francais/">d&#8217;une stack prometheus/grafana</a> et de node-exporter pour aller avec. Simple, pratique et vous le verrez pas besoin d&#8217;y passer des heures à coder pour avoir un résultat sympathique.</p>



<p>Mais avant cela, il faut procéder de manière un peu itérative <strong>avec les principaux modules ansible</strong>. Là encore pas besoin de savoir faire des choses complexes mais un minimum.</p>



<p>Aujourd&#8217;hui, penchons-nous sur le module apt (le manager de paquets sous debian, il existe bien sûr la même chose sous Redhat/Centos avec yum). Si votre infrastructure est basée sur cette OS, je vous conseille de bien le retenir et de se familiariser avec ses principales options/paramètres.</p>



<p>Justement débutons avec les principaux paramètres de ce module ansible.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE - 18. LE MODULE APT : INSTALLATION, GESTION, SUPPRESSION DE PAQUETS" width="625" height="352" src="https://www.youtube.com/embed/0Capz3Z6Fds?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Les paramètres du module APT</h2>



<p>Voici une liste <strong>assez exhaustive de ses paramètres</strong>. Nous verrons leur principales utilisation juste après.</p>



<ul class="wp-block-list"><li>allow_unauthenticated : autoriser l&#8217;installation de paquets non authentifiés</li><li>autoclean : effacement des anciennes versions des paquets</li><li>cache_valid_time : durée durant laquelle ne pas remettre à jour le cache apt</li><li>deb : lien vers une source de paquet .deb</li><li>default_release : version par défaut</li><li>dpkg_options : option d&#8217;installation dpkg</li><li>force : équivaut à &#8211;force-yes, désactive la signature et certificats de paquets</li><li>force_apt_get : force l&#8217;utilisation de apt-get</li><li>install_recommends : activer ou désactiver les paquets recommandés (dépend des OS)</li><li>name : nom du paquet</li><li>only_upgrade : met à jour uniquement les paquets installés</li><li>policy_rc_d : règle de déclenchement automatique à l&#8217;installation d&#8217;un paquet</li><li>purge : purge les fichiers de configurations (&#8211;purge)</li><li>state : present / absent / latest / fixed / build-dep</li><li>update_cache : réaliser un update avant l&#8217;installation</li><li>update_cache_retries : nombre de tentatives de l&#8217;update</li><li>update_cache_retry_max_delay : délai de chaque retry</li><li>upgrade : yes / no / safe / dist / full</li></ul>



<hr class="wp-block-separator"/>



<p>Voilà, la liste n&#8217;est finalement pas si longue que cela. Mais voyons un peu son utilisation avec quelques exemples pour la mise en pratique.</p>



<h2 class="wp-block-heading">Utilisation du module APT ansible</h2>



<p>A savoir que l&#8217;on peut combiner certains paramètres <strong>alors que dans la pratique il s&#8217;agit de lignes de commandes APT distinctes</strong>.</p>



<p>Par exemple, si nous voulons simplement mettre à jour le cache APT local, voici ce que nous pouvons utiliser :</p>



<pre class="wp-block-preformatted">  - name:
    apt:
      update_cache: yes
      cache_valid_time: 3600</pre>



<p>Dans ce cas de figure, nous <strong>mettons à jour le cache</strong> et nous lui donnons une durée de vie de 3600 secondes. Cela évite tout simplement de remettre à jour le cache après chaque passage.</p>



<p>Mais nous pouvons <strong>combiner la mise à jour du cache et l&#8217;installation d&#8217;un paquet</strong> (par exemple HaProxy)</p>



<pre class="wp-block-preformatted">  - name:
    apt:
      name: haproxy
      default_release: stretch-backports
      update_cache: yes
      cache_valid_time: 60</pre>



<p>Là nous précisons éventuellement la release utilisée pour l&#8217;installation.</p>



<p>Par défaut et sans précision, le paramètre state est à &#8220;present&#8221;. Nous souhaitons donc que le paquet soit installé. Mais nous pouvons préciser <strong>un state à latest</strong>. L&#8217;impact ? En cas de run ansible et de la présence d&#8217;une nouvelle version du paquet, <strong>l&#8217;applicatif sera mis à jour</strong>. Pas forcément une bonne idée pour la stabilité des versions et de votre infrastructure.</p>



<p>Par exemple :</p>



<pre class="wp-block-preformatted">  - name:
    apt:
      name: haproxy,nginx
      update_cache: yes
      cache_valid_time: 60
      state: latest</pre>



<p>Bien sûr vous l&#8217;avez deviné, pour supprimer un paquet, on va utiliser <strong>un state absent</strong>.</p>



<pre class="wp-block-preformatted">  - name:
    apt:
      name: haproxy
      state: absent</pre>



<p>Ou encore pour une suppression totale des anciennes versions avec autoremove et &#8211;purge pour les fichiés liés :</p>



<pre class="wp-block-preformatted">  - name:
    apt:
      name: haproxy
      state: absent
      purge: yes
      autoremove: yes</pre>



<p>Nous pouvons aussi réaliser <strong>un dist-upgrade pour monter de version notre distribution</strong> (par exemple passer de stretch à buster). Attention sous réserve de mise à jour des fichiers de configurations des dépôts au préalable.</p>



<pre id="block-6cd8c8d6-e340-482c-be76-d60643c30663" class="wp-block-preformatted">  - name:
    apt:
      upgrade: dist</pre>



<p>Voilà finalement un module utile et simple, tout ce que l&#8217;on aime. Nous verrons aussi que l&#8217;on peut associer à ce module, le module de gestion des reboots, très pratique pour les mises à jour.</p>



<p></p>
<p>L’article <a href="https://xavki.blog/module-apt-ansible-indispensable/">Le module APT de ansible, un indispensable</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les boucles with avec ansible</title>
		<link>https://xavki.blog/boucles-with-ansible/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Fri, 02 Apr 2021 17:06:32 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<guid isPermaLink="false">https://xavki.blog/?p=1216</guid>

					<description><![CDATA[<p><img width="1280" height="720" src="https://xavki.blog/wp-content/uploads/2021/04/ansible-17-with-items-boucles.png" class="attachment- size- wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" loading="lazy" srcset="https://xavki.blog/wp-content/uploads/2021/04/ansible-17-with-items-boucles.png 1280w, https://xavki.blog/wp-content/uploads/2021/04/ansible-17-with-items-boucles-300x169.png 300w, https://xavki.blog/wp-content/uploads/2021/04/ansible-17-with-items-boucles-1024x576.png 1024w, https://xavki.blog/wp-content/uploads/2021/04/ansible-17-with-items-boucles-768x432.png 768w, https://xavki.blog/wp-content/uploads/2021/04/ansible-17-with-items-boucles-624x351.png 624w" sizes="auto, (max-width: 1280px) 100vw, 1280px" />Continuons sur notre formation ansible. Alors que j&#8217;ai tourné la 123ème d&#8217;un cours qui sera assez complet sur ansible, je vous propose de continuer progressivement après notre article sur stat et register. Pour les personnes qui souhaitent accéder à ces... <a href="https://xavki.blog/boucles-with-ansible/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/boucles-with-ansible/">Les boucles with avec ansible</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="1280" height="720" src="https://xavki.blog/wp-content/uploads/2021/04/ansible-17-with-items-boucles.png" class="attachment- size- wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" loading="lazy" srcset="https://xavki.blog/wp-content/uploads/2021/04/ansible-17-with-items-boucles.png 1280w, https://xavki.blog/wp-content/uploads/2021/04/ansible-17-with-items-boucles-300x169.png 300w, https://xavki.blog/wp-content/uploads/2021/04/ansible-17-with-items-boucles-1024x576.png 1024w, https://xavki.blog/wp-content/uploads/2021/04/ansible-17-with-items-boucles-768x432.png 768w, https://xavki.blog/wp-content/uploads/2021/04/ansible-17-with-items-boucles-624x351.png 624w" sizes="auto, (max-width: 1280px) 100vw, 1280px" />
<p class="has-drop-cap">Continuons sur <a href="https://xavki.blog/ansible-tutoriaux-francais/">notre formation ansible</a>. Alors que j&#8217;ai tourné la 123ème d&#8217;un cours qui sera assez complet sur ansible, je vous propose de continuer progressivement après notre article <a href="https://xavki.blog/stat-register-commencer-ansible/">sur stat et register</a>. Pour les personnes qui souhaitent accéder à ces vidéos sans attendre, elles sont déjà disponibles <a href="https://www.youtube.com/channel/UCs_AZuYXi6NA9tkdbhjItHQ/join">pour les membres VIP de la chaine xavki</a>  qui la soutiennent.</p>



<p>En matière de formation, je pense qu&#8217;il faut être progressif et patient. C&#8217;est pour cela que je préfère aborder quelques notions au début mais sans brûler les étapes.</p>



<p>Aujourd&#8217;hui nous allons <strong>nous former à l&#8217;utilisation des boucles dans ansible</strong>. Les principales sont faciles à retenir car elles commencent par : with_*. La plus répandu étant with_items.</p>



<p>Avant de commencer, il me semble nécessaire de préciser que ansible est en cours d&#8217;évolutions dans ce domaine. L&#8217;objectif est <strong>de basculer à loop</strong> et remplacer potentiellement les with_*. Pour le moment nous n&#8217;en sommes pas là et les with_* sont plus faciles à aborder et retenir pour commencer. La documentation précise bien que cette migration ne se fait pas rapidement et que with_* possède encore de beaux jours devant lui, <a href="https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html">on est loin de le voir déprécier</a>.</p>



<h2 class="wp-block-heading">Les différentes boucles possible avec with</h2>



<p>Si loop ne remplace pas encore les with, c&#8217;est essentiellement car il en existe de nombreux et que chacun dispose de boucler sur une fonctionnalité particulière :</p>



<ul class="wp-block-list"><li>with_items : sur une liste de dictionnaire (ensemble de clefs/valeurs)</li><li>with_nested : sur une liste de listes</li><li>with_dict : parcourir un dictionnaire</li><li>with_fileglob : sur une liste de fichiers de répertoire avec ou sans pattern mais non récursif</li><li>with_filetree : sur une liste de fichier d&#8217;une arborescence (recursif) et avec pattern</li><li>with_together : permet de croiser 2 listes</li><li>with_sequence : pour parcourir un range (interval)</li><li>with_random_choice : tirage aléatoire dans une liste</li><li>with_first_found : sur le premier élément trouvé d&#8217;une liste</li><li>with_lines : pour parcourir chaque ligne d&#8217;un programme (exemple : shell)</li><li>with_ini : pour parcourir un fichier au format ini</li><li>with_inventory_hostnames : pour récupérer et parcourir des éléments d&#8217;un inventaire</li></ul>



<p>On a donc du choix, mes préférés étant with_items et with_fileglob principalement.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE - 17. LES BOUCLES : WITH_ITEMS ET LES AUTRES WITH" width="625" height="352" src="https://www.youtube.com/embed/Iyw_s61sDmU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Comment utiliser with_* avec ansible ?</h2>



<p>C&#8217;est très simple. Les éléments d&#8217;entrées sont définis dans le with_* et en sortie sont utilisable <strong>par une variable &#8220;item&#8221;</strong>. En cas d&#8217;éléments si disposant de plusieurs clefs ont les utilisera avec &#8220;item.clef1&#8221;, &#8220;item.clef2&#8243;&#8230;</p>



<p>Dans le cas le plus simple nous pouvons commencer par parcourir une simple lite d&#8217;éléments :</p>



<pre class="wp-block-preformatted">  - name: boucle création de répertoire
    file:
      path: /tmp/xavki/{{ item }}
      state: directory
      recurse: yes
    with_items:
    - xavki1
    - xavki2
    - xavki3
    - xavki4</pre>



<p>Ou encore, dans un playbook, nous pouvons faire un test avec une liste de dictionnaires :</p>



<pre class="wp-block-preformatted">  - name: création de fichiers
    file:
      path: /tmp/xavki/{{ item.dir }}/{{ item.file }}
      state: touch
    with_items:
    - { dir: "xavki1", file: "fichierA"}
    - { dir: "xavki2", file: "fichierB"}
    - { dir: "xavki3", file: "fichierC"}
    - { dir: "xavki4", file: "fichierD"}
</pre>



<p>Nos clefs sont &#8220;dir&#8221; et &#8220;file&#8221; et donc nous allons <strong>les utiliser avec item.dir et item.file.</strong> Ansible fait le reste pour parcourir la boucle. C&#8217;est assez facile pour débuter !!! ou encore en passant par une variable.</p>



<pre class="wp-block-preformatted">  vars:
    fichiers:
    - { dir: "xavki1", file: "fichierA"}
    - { dir: "xavki2", file: "fichierB"}
    - { dir: "xavki3", file: "fichierC"}
    - { dir: "xavki4", file: "fichierD"}
  tasks:
  - name: création de fichiers
    file:
      path: /tmp/xavki/{{ item.dir }}/{{ item.file }}
      state: touch
    with_items:
    - "{{ fichiers }}"
</pre>



<p>Alors maintenant imaginons que nous souhaitions parcourir les machines composant un groupe de notre inventaire. Le premier réflexe en méconnaissant les boucles serait de faire la chose suivante :</p>



<pre class="wp-block-preformatted"> with_items:
    - "{{ groups['all'] }}"</pre>



<p>C&#8217;est fonctionnel car on pourra bien récupérer la liste des machines avec la variable &#8220;item&#8221; de notre with_items. Mais nous l&#8217;avons vu , il existe un with dédié à cette tâche with_inventory_hostnames. Ainsi nous pouvons le faire de cette manière :</p>



<pre class="wp-block-preformatted">  - name: création de fichiers
    file:
      path: /tmp/{{ item }}
      state: touch
    with_inventory_hostnames:
    - all</pre>



<h2 class="wp-block-heading">Les boucles un outil indispensable</h2>



<p>Clairement nous ne verrons pas d&#8217;exemples dans cet article. L&#8217;idéal pour manipuler les boucles c&#8217;est la pratique d&#8217;exemples réels. Cela fera l&#8217;objet des TP. </p>



<p>Ainsi les boucles vont nous permettre de définir des variables de types dictionnaires de manière à être en mode descriptif et avoir des blocs qui représentent notre infrastructure. Le with_fileglob nécessite un peu plus de pratique et de recul sur la manière d&#8217;organiser un code d&#8217;infra as code. Ainsi, nous allons pouvoir nous en servir pour sépcifier un répertoire contenant des usitsateurs : clefs ssh, login&#8230; Et une fois cela réalisé il ne restera qu&#8217;à récupérer les variables contenues dans ces fichiers. Ce point est l&#8217;un de mes préférés sur ansible donc nous n&#8217;y couperons pas.</p>



<p>Si vous souhaitez ne pas manquer les prochaines vidéos, vous pouvez vous abonner. Et pour m&#8217;aider encore plus vous pouvez éventuellement liker les vidéos.</p>
<p>L’article <a href="https://xavki.blog/boucles-with-ansible/">Les boucles with avec ansible</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Stat et Register, indispensables pour commencer avec ansible</title>
		<link>https://xavki.blog/stat-register-commencer-ansible/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Wed, 10 Mar 2021 11:35:21 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<guid isPermaLink="false">https://xavki.blog/?p=1187</guid>

					<description><![CDATA[<p>Le cours ansible en ligne avance petit à petit car j&#8217;ai réalisé un peu plus de 115 vidéos tutoriels pour le moment ( et c&#8217;est pas fini 😉 ). Cette formation est disponible en totalité pour les membres vip pour... <a href="https://xavki.blog/stat-register-commencer-ansible/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/stat-register-commencer-ansible/">Stat et Register, indispensables pour commencer avec ansible</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-drop-cap">Le cours ansible en ligne avance petit à petit car j&#8217;ai réalisé un peu plus de 115 vidéos tutoriels pour le moment ( et c&#8217;est pas fini 😉 ). Cette formation est disponible en totalité <a href="https://www.youtube.com/channel/UCs_AZuYXi6NA9tkdbhjItHQ/join">pour les membres vip</a> pour le moment. Mais ces vidéos deviennent disponible publiquement au fur et à mesure des mois et des semaines. Devenir membre permet de soutenir la <a href="https://www.youtube.com/channel/UCs_AZuYXi6NA9tkdbhjItHQ">chaine xavki</a>.</p>



<p>La dernière vidéo publiée s&#8217;adresse plutôt aux débutants avec 2 éléments utiles au quotidien dans vos développements ansible : <strong>le register et le module stat</strong>. J&#8217;ai trouvé cela intéressant de les associer car on le fait cela souvent dans la pratique.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE - 16. LE REGISTER ET LE MODULE STAT" width="625" height="352" src="https://www.youtube.com/embed/yI8duHq9HMY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Le module stat de ansible</h2>



<p>Idéal pour commencer, <a href="https://docs.ansible.com/ansible/devel/collections/ansible/builtin/stat_module.html">ce module ansible</a> permet de vérifier notamment <strong>l&#8217;existence ou non de fichiers ou de répertoires</strong>. Mais pas seulement, le module stat s&#8217;apparente aux données accessibles <a href="https://linuxize.com/post/stat-command-in-linux/">via la commande stat sous linux</a>.</p>



<p>Ainsi une commande stat fournie <strong>les principales informations fournies par les inodes</strong>. On pourrait résumer cela aux metadatas de votre filesystem.</p>



<p><code>oki@doki ~/playground/centreserver $ ▶ stat deploy.sh<br>File: deploy.sh<br>Size: 3710 Blocks: 8 IO Block: 4096 regular file<br>Device: fd01h/64769d Inode: 11274196 Links: 1<br>Access: (0755/-rwxr-xr-x) Uid: (1001/ oki) Gid: (1001)<br>Access: 2021-03-09 15:49:37.803546224 +0100<br>Modify: 2021-02-09 18:29:07.371956532 +0100<br>Change: 2021-02-09 18:29:07.371956532 +0100<br>Birth: -</code></p>



<p>Je vous propose donc de créer un fichier avec ansible et lancer dessus le mode stat en deuxième task.</p>



<pre class="wp-block-preformatted">  - name: création d'un fichier
    file:
      path: /tmp/xavki.txt
      state: touch
      owner: xavki</pre>



<p>puis lançons<strong> le module stat</strong> :</p>



<pre class="wp-block-preformatted">  - name: check avec stat
    stat:
      path: /tmp/xavki.txt</pre>



<p>Les paramètres de ce module ansible sont :</p>



<ul class="wp-block-list"><li>path : chemin du fichier ou répertoire</li><li>follow : suivre les liens symboliques</li><li>get_checksum : récupérer la checksum</li><li>checksum_algorithm : type de checksum (md5, etc)</li><li>get_mime: récupération du type de données</li></ul>



<p>Mais une fois que l&#8217;on a fait cela <strong>on ne dispose pas encore des données collectées</strong> par le module. Pour cela nous avons besoin d&#8217;utiliser le <strong>register</strong>.</p>



<h2 class="wp-block-heading">Le register, un ami pour vos modules</h2>



<p>Si on devait résumer le register, on pourrait dire qu&#8217;il s&#8217;agit d&#8217;un créateur de variables. Il permet de <strong>récupérer les outputs/sorties des modules</strong>. En effet de nombreux modules permettent de récupérer des informations lorsqu&#8217;ils sont exécutés. Par exemple, le module ec2 de aws va permettre de récupérer toutes les métadatas de l&#8217;instance créée.</p>



<p>Pour le module stat de ansible, il va récupérer les informations du fichier ou du répertoire en question.</p>



<p>Pour l&#8217;utiliser c&#8217;est très simple, il suffit de rajouter register et le nom de la variable créée qui contiendra le contenu de la sortie. Attention <strong>à l&#8217;indentation avec ansible,</strong> il s&#8217;agit de mettre le register au même niveau que le nom du module.</p>



<p>Ainsi nous pourrions avoir une succession de tâches suivantes :</p>



<pre class="wp-block-preformatted">  tasks:
  - name: création d'un fichier
    file:
      path: /tmp/xavki.txt
      state: touch
      owner: root
    when: xavki_file is defined
  - name: check avec stat
    stat:
      path: /tmp/xavki.txt
    register: __fichier_xavki
  - name: debug
    debug:
      var: __fichier_xavki</pre>



<p>La première pour la création du fichier.</p>



<p>La seconde pour passer un stat sur le fichier xavki.txt avec le register (création de la variable __fichier_xavki).</p>



<p>Et enfin pour visualiser le contenu de la variable obtenue, nous utilisons le module debug.</p>



<p><strong><em>Bonne pratique : j&#8217;ai pour habitude de préfixer ce type de variables par un double underscore. Cela me permet d&#8217;une part de les identifier plus rapidement et d&#8217;autres part d&#8217;utiliser plus rapidement l&#8217;autocomplétion (par exemple dans vscode).</em></strong></p>



<p>Dans le cas de stat, vous pouvez ensuite<strong> parcourir le contenu de cette variable ansible</strong>. Ainsi pour utiliser la valeur de stat et de la clef &#8220;exists&#8221; voici comment faire :</p>



<p><code>__fichier_xavki.stat.exists</code></p>



<p>Maintenant nous sommes donc en mesure de vérifier l&#8217;existence d&#8217;un fichier ou d&#8217;un répertoire et de conditionner la tache suivante à cela.</p>



<pre class="wp-block-preformatted">  - name: création répertoire xavki
    file:
      path: /tmp/xavki
      state: directory
    when: __fichier_xavki.stat.exists and xavki_file is defined</pre>



<p>Mais je vous invite à vérifier le contenu de l&#8217;output en totalité et vous verrez que nous disposons des mêmes éléments que si nous avions lancé la commande linux.</p>



<p>Retrouvez les <a href="https://xavki.blog/ansible-tutoriaux-francais/">tutoriels ansible ici</a> et abonnez-vous si vous souhaitez ne pas manquer les prochains articles ou vidéos.</p>
<p>L’article <a href="https://xavki.blog/stat-register-commencer-ansible/">Stat et Register, indispensables pour commencer avec ansible</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Formation Ansible : créer un utilisateur avec le module user</title>
		<link>https://xavki.blog/formation-ansible-creer-user/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Tue, 23 Feb 2021 18:54:00 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<guid isPermaLink="false">https://xavki.blog/?p=1161</guid>

					<description><![CDATA[<p>Petit à petit, nous allons rentrer dans l&#8217;utilisation de ansible. En effet, il me semble logique de ne pas brûler les étapes pour apprendre mais surtout comprendre l&#8217;outil et ses principes. Ansible est de plus en plus au coeur des... <a href="https://xavki.blog/formation-ansible-creer-user/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/formation-ansible-creer-user/">Formation Ansible : créer un utilisateur avec le module user</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-drop-cap">Petit à petit, nous allons rentrer dans l&#8217;utilisation de ansible. En effet, il me semble logique de ne pas brûler les étapes pour apprendre mais surtout comprendre l&#8217;outil et ses principes.</p>



<p>Ansible est de plus en plus au coeur des orchestrations <strong>dans un esprit de devops</strong>. Il permet à partir de choses simples et descriptives de configurer et déployer des infrastructures mais aussi des applicatifs. </p>



<p>Dans cet article <a href="https://xavki.blog/ansible-tutoriaux-francais/">dédié à la formation à ansible</a>, je vous propose de <strong>découvrir le module user</strong>. C&#8217;est un peu une base car il permet comme son nom l&#8217;indique de créer des users&#8230; et l&#8217;installation de serveurs ne se fait pas sans créer d&#8217;utilisateurs.</p>



<p>Ce module se base principalement sur les commandes : useradd, userdel, usermod&#8230;</p>



<p>Comme je le rappelle dans cette page, il prend <a href="https://gitlab.com/xavki/presentation-ansible-fr/-/blob/master/15-users/slides.md">de nombreux paramètres</a>. Vous povuez aussi vous rapprocher de la documentation en anglais et plus complète du site de ansible.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE- 15. MODULE USER : COMMENT CREER, SUPPRIMER, GERER DES UTILISATEURS" width="625" height="352" src="https://www.youtube.com/embed/O9KOT2jxBu4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Débutons par la mise en place et le premier run du module user</h2>



<p>Le cas le plus simple pour commencer est de se créer un utiliseurs de démo. Pour cela il vous faut quelques serveurs (je vous invite à regarder <a href="https://xavki.blog/un-script-bash-et-docker-pour-vous-aider-a-developper-des-roles-ansible/">mon article précédent</a> pour vous créer des conteneurs docker similaires à des VM).</p>



<p>Ensuite bien sûr vous devez <strong>disposer aussi d&#8217;un inventaire et d&#8217;un playbook</strong> mais maintenant vous commencez à connaître.</p>



<p>Pour créer un user sans droits ni contraintes particulières, nous pouvons commencer par cette tâche.</p>



<pre class="wp-block-preformatted">- name: création de xavki
  user:
    name: xavki
    state: present
    password: "{{ 'password' | password_hash('sha512') }}"  </pre>



<p>Nous utilisons bien &#8220;user&#8221; et lui passons 3 paramètres :</p>



<ul class="wp-block-list"><li><strong>le nom</strong> : celui de l&#8217;utilisateur que nous voulons créer</li><li><strong>le statut</strong> : est-ce que l&#8217;on souhaite qu&#8217;il soit créé ou supprimé (present/absent en anglais pour ansible)</li><li><strong>le password</strong> : petite particularité c&#8217;est que celui-ci ne peut pas être complètement en clair (en théorie il ne doit pas l&#8217;être du tout mais nous n&#8217;avons pas encore vu dans cette formation <em>ansible-vault</em>). Donc nous utilisons le filtre jinja <em>password_hash </em>et lui précisons que nous voulons un hash de type sha512.</li></ul>



<p>Et bien sûr nous lançons notre playbook :</p>



<p><code>ansible-playbook -i 00_inventory.yml playbook.yml</code></p>



<h2 class="wp-block-heading">Ajoutons quelques paramètres pour mieux configurer notre utilisateur</h2>



<p>Bien c&#8217;est un premier pas et vous pouvez vérifier cela en vous connectant sur une machine distante avec une simple commande comme :</p>



<p><code>id xavki</code></p>



<p>Mais admettons que nous souhaitions <strong>ajouter ce user à un groupe existant</strong>. On parle bien ici de l&#8217;ajouter et non pas d&#8217;écraser son groupe. Dans notre exemple, ajoutons-le au groupe sudo pour plus de liberté ;).</p>



<pre class="wp-block-preformatted">- name: création de xavki
  user:
    name: xavki
    state: present
    groups: sudo
    append: yes
    password: "{{ 'password' | password_hash('sha512') }}"  </pre>



<p>On ajoute donc le paramètre <em>group</em> et le paramètre append à yes. Ce dernier assure que nous ajoutions bien le groupe au user et pas l&#8217;écrasement de son appartenance aux autres groupes.</p>



<p>Cependant, nous aimons associer <a href="https://youtu.be/gclyVcmpRaM">une clef ssh</a> à un utilisteur. Pour cela ansible permet différentes situations. Ici nous allons l&#8217;ajouter et voir le retour de la tâche de création user grâce à un <em>debug</em>.</p>



<pre class="wp-block-preformatted">  - name: création du user xavki
    user:
      name: xavki
      state: present
      generate_ssh_key: yes
      uid: 1200
      groups: sudo
      append: yes
      password: "{{ 'password' | password_hash('sha512') }}"
    register: mavar
  - name: debug
    debug:
      msg: "{{ mavar }}"</pre>



<p>Et vous pouvez constater dans la sortie que l&#8217;on peut récupérer les éléments relatifs à la clef SSH.</p>



<p>Et nous pouvons bien lui ajouter un shell on retrouve <strong>les options de useradd en ligne de commande</strong>.</p>



<pre class="wp-block-preformatted">  - name: création du user xavki
    user:
      name: xavki
      state: present
      shell: /sbin/nologin
      generate_ssh_key: yes
      uid: 1200
      groups: sudo
      append: yes
      password: "{{ 'password' | password_hash('sha512') }}"
      password_lock: yes</pre>



<p>Remarquez que là nous ajoutons un password_lock. Cela permet de conserver l&#8217;utilisateur tout en l&#8217;empêchant de se connecter.</p>



<p>Et enfin, vous l&#8217;avez deviné, nous allons supprimer cet utilisateur en passant simplement le nom et le status &#8220;absent&#8221;.</p>



<pre class="wp-block-preformatted">  - name: création du user xavki
    user:
      name: xavki
      state: absent</pre>



<p>Et voilà nous venons de nous former à l&#8217;utilisation du module user de ansible.</p>
<p>L’article <a href="https://xavki.blog/formation-ansible-creer-user/">Formation Ansible : créer un utilisateur avec le module user</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Un script bash et docker pour vous aider à développer des rôles ansible</title>
		<link>https://xavki.blog/un-script-bash-et-docker-pour-vous-aider-a-developper-des-roles-ansible/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Sat, 13 Feb 2021 19:47:50 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<category><![CDATA[Docker]]></category>
		<guid isPermaLink="false">https://xavki.blog/?p=1149</guid>

					<description><![CDATA[<p>Ce script n&#8217;a presque pas pris une ride depuis ces premiers pas sur le chaine youtube. Eh oui c&#8217;était la première vidéo de la chaine xavki. Je l&#8217;ai légèrement toiletté et j&#8217;ai bien sûr mis à jour l&#8217;image docker avec... <a href="https://xavki.blog/un-script-bash-et-docker-pour-vous-aider-a-developper-des-roles-ansible/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/un-script-bash-et-docker-pour-vous-aider-a-developper-des-roles-ansible/">Un script bash et docker pour vous aider à développer des rôles ansible</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-drop-cap">Ce script n&#8217;a presque pas pris une ride depuis ces premiers pas sur le chaine youtube. Eh oui c&#8217;était <strong>la première vidéo de la chaine xavki</strong>. Je l&#8217;ai légèrement toiletté et j&#8217;ai bien sûr mis à jour l&#8217;image docker avec une version plus récente de Debian (10).</p>



<p>Il m&#8217;est très utilise pour <a href="https://xavki.blog/ansible-tutoriaux-francais/">mes formations ansible</a>.</p>



<p>Lorsque j&#8217;ai créé ce script, j&#8217;avais besoin de tester régulièrement les rôles que je développais. J&#8217;utilisais déjà un peu vagrant et je trouvais que lancer une machine virtuelle demandais du temps. Et comme pour bien développer du ansible, il me semble très important de tout casser pour tout refaire, <a href="https://xavki.blog/docker-tutoriaux-francais/">je me suis réorienté vers des conteneurs docker</a>. Après coup, LXD/LXC serait encore plus optimal, ces conteneurs étant des conteneurs systèmes.</p>



<p>Bref, à l&#8217;époque j&#8217;ai creusé et cherchais <strong>comment avoir des conteneurs avec SSH et systemD</strong>. Finalement cela n&#8217;est pas très compliqué après avoir installé systemd, il suffit de supprimer quelques répertoires et de monter ceux de la machine en dessous.</p>



<p>Cependant attention, cela signifie aussi de lancer ces conteneurs en privileged. Donc tout cela cumulé, rend ce concept très défaillant d&#8217;un point de vue sécurité et non sécurisable. Il faut donc l&#8217;utiliser et supprimer les conteneurs après utilisation. En tout cas c&#8217;est ce que je recommande fortement.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE- 14. GAGNEZ DU TEMPS : DEVELOPPEZ AVEC DOCKER (ASTUCE)" width="625" height="352" src="https://www.youtube.com/embed/aan0zpn2N-4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Le Dockerfile d&#8217;une Debian avec SSH et SystemD</h2>



<p>Je vous propose donc le <a href="https://docs.docker.com/engine/reference/builder/">Dockerfile</a> suivant : </p>



<pre class="wp-block-preformatted">FROM debian:10

ENV container docker
ENV LC_ALL C
ENV DEBIAN_FRONTEND noninteractive

RUN echo 'deb http://deb.debian.org/debian stretch-backports main' >> /etc/apt/sources.list

RUN apt-get update \
    &amp;&amp; apt-get install -y --no-install-recommends systemd python3 sudo bash net-tools openssh-server openssh-client vim git\
    &amp;&amp; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PermitRootLogin/PermitRootLogin/' /etc/ssh/sshd_config
RUN rm -f /lib/systemd/system/multi-user.target.wants/* \
    /etc/systemd/system/*.wants/* \
    /lib/systemd/system/local-fs.target.wants/* \
    /lib/systemd/system/sockets.target.wants/*udev* \
    /lib/systemd/system/sockets.target.wants/*initctl* \
    /lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup* \
    /lib/systemd/system/systemd-update-utmp*

RUN ln -s /lib/systemd/system /sbin/init
RUN systemctl set-default multi-user.target
RUN sed -i 's#root:\*#root:sa3tHJ3/KuYvI#' /etc/shadow
ENV init /lib/systemd/systemd
VOLUME [ "/sys/fs/cgroup" ]

ENTRYPOINT ["/lib/systemd/systemd"]</pre>



<p>Plusieurs remarques donc :</p>



<ul class="wp-block-list"><li>on installe ssh et systemd</li><li>on permet le root login avec ssh</li><li>on supprime de nombreux liens systemd car notre conteneur ne dispose pas de son propre matériel</li><li>on définit un passsowr pour root (&#8220;password&#8221; par défaut)</li><li>on prévoit de monter /sysS</li><li>on lance en entrypoint : systemd (donc ssh n&#8217;est pas lancé en l&#8217;état)</li></ul>



<p>Lancer un conteneur avec SSH/SystemD</p>



<h2 class="wp-block-heading">Voici comment lancer avec un simple docker run un conteneur avec cette image</h2>



<p>Là encore rien de très compliqué :</p>



<p><code>docker run -d --cap-add NET_ADMIN --cap-add SYS_ADMIN --publish-all=true -v /srv/data:/srv/html -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name &lt;nom_contneeur> -h &lt;nom_conteneur> priximmo/debian_systemd:v1.0</code></p>



<p>On permet une élévation de privilège de notre conteneur sur notre hosts sur les capabilities NET_ADMIN et SYS_ADMIN. </p>



<p>On publie tous les ports pour pouvoir utiliser les applicatifs sur l&#8217;ip du conteneur sans se poser de question.</p>



<p>On monte un répertoire d&#8217;échange entre le host et le conteneur pour /srv/data.</p>



<p>On monte en lecture seul /sys/fs/cgroup.</p>



<h2 class="wp-block-heading">Maintenant on automatise le lancement des conteneurs avec un script bash</h2>



<p>L&#8217;enjeu est <strong>tout de même de pouvoir créer à la volée des conteneurs</strong>. Et d&#8217;essayer de gagner du temps dans le développement ansible. Au passage, bien sûr, ce script est utilisable dans d&#8217;autres cas d&#8217;utilisation (testing, dev&#8230;).</p>



<p>Voici le script que je vous propose et que vous pourrez personnaliser et compléter à votre goût.</p>



<pre class="wp-block-preformatted">#!/bin/bash

############################################################
#
#  Description : déploiement à la volée de conteneur docker
#
#  Auteur : Xavier
#
#  Date : 28/12/2018 - V2.0
#
###########################################################


# Functions #########################################################

help(){
echo "

Options :
		- --create : lancer des conteneurs

		- --drop : supprimer les conteneurs créer par le deploy.sh
	
		- --infos : caractéristiques des conteneurs (ip, nom, user...)

		- --start : redémarrage des conteneurs

		- --ansible : déploiement arborescence ansible

"

}

createNodes() {
	# définition du nombre de conteneur
	nb_machine=1
	[ "$1" != "" ] &amp;&amp; nb_machine=$1
	# setting min/max
	min=1
	max=0

	# récupération de idmax
	idmax=`docker ps -a --format '{{ .Names}}' | awk -F "-" -v user="$USER" '$0 ~ user"-debian" {print $3}' | sort -r |head -1`
	# redéfinition de min et max
	min=$(($idmax + 1))
	max=$(($idmax + $nb_machine))

	# lancement des conteneurs
	for i in $(seq $min $max);do
		docker run -tid --privileged --publish-all=true -v /srv/data:/srv/html -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name $USER-debian-$i -h $USER-debian-$i priximmo/buster-systemd-ssh
		docker exec -ti $USER-debian-$i /bin/sh -c "useradd -m -p sa3tHJ3/KuYvI $USER"
		docker exec -ti $USER-debian-$i /bin/sh -c "mkdir  ${HOME}/.ssh &amp;&amp; chmod 700 ${HOME}/.ssh &amp;&amp; chown $USER:$USER $HOME/.ssh"
	docker cp $HOME/.ssh/id_rsa.pub $USER-debian-$i:$HOME/.ssh/authorized_keys
	docker exec -ti $USER-debian-$i /bin/sh -c "chmod 600 ${HOME}/.ssh/authorized_keys &amp;&amp; chown $USER:$USER $HOME/.ssh/authorized_keys"
		docker exec -ti $USER-debian-$i /bin/sh -c "echo '$USER   ALL=(ALL) NOPASSWD: ALL'>>/etc/sudoers"
		docker exec -ti $USER-debian-$i /bin/sh -c "service ssh start"
		echo "Conteneur $USER-debian-$i créé"
	done
	infosNodes	

}

dropNodes(){
	echo "Suppression des conteneurs..."
	docker rm -f $(docker ps -a | grep $USER-debian | awk '{print $1}')
	echo "Fin de la suppression"
}

startNodes(){
	echo ""
	docker start $(docker ps -a | grep $USER-debian | awk '{print $1}')
  for conteneur in $(docker ps -a | grep $USER-debian | awk '{print $1}');do
		docker exec -ti $conteneur /bin/sh -c "service ssh start"
  done
	echo ""
}


createAnsible(){
	echo ""
  	ANSIBLE_DIR="ansible_dir"
  	mkdir -p $ANSIBLE_DIR
  	echo "all:" > $ANSIBLE_DIR/00_inventory.yml
	echo "  vars:" >> $ANSIBLE_DIR/00_inventory.yml
    echo "    ansible_python_interpreter: /usr/bin/python3" >> $ANSIBLE_DIR/00_inventory.yml
  echo "  hosts:" >> $ANSIBLE_DIR/00_inventory.yml
  for conteneur in $(docker ps -a | grep $USER-debian | awk '{print $1}');do      
    docker inspect -f '    {{.NetworkSettings.IPAddress }}:' $conteneur >> $ANSIBLE_DIR/00_inventory.yml
  done
  mkdir -p $ANSIBLE_DIR/host_vars
  mkdir -p $ANSIBLE_DIR/group_vars
	echo ""
}

infosNodes(){
	echo ""
	echo "Informations des conteneurs : "
	echo ""
	for conteneur in $(docker ps -a | grep $USER-debian | awk '{print $1}');do      
		docker inspect -f '   => {{.Name}} - {{.NetworkSettings.IPAddress }}' $conteneur
	done
	echo ""
}



# Let's Go !!! ###################################################################""

#si option --create
if [ "$1" == "--create" ];then
	createNodes $2

# si option --drop
elif [ "$1" == "--drop" ];then
	dropNodes

# si option --start
elif [ "$1" == "--start" ];then
	startNodes

# si option --ansible
elif [ "$1" == "--ansible" ];then
	createAnsible

# si option --infos
elif [ "$1" == "--infos" ];then
	infosNodes

# si aucune option affichage de l'aide
else
	help

fi</pre>



<p>Plusieurs options sont prévues :</p>



<ul class="wp-block-list"><li>&#8211;create : la création de conteneurs en ajoutant à cette option un nombre pour indiquer le nombre de docker souhaités</li><li>&#8211;drop : pour supprimer les conteneurs lancés avec ce script</li><li>&#8211;start : en cas d&#8217;arrêt et de relance de votre machine, les conteneurs seront stoppés, cette options permet de les relancer à la volée</li><li>&#8211;ansilbe : créé un répertoire dédié aux développements ansible avec notamment un inventory déjà rempli et complété par les ip de chacun des conteneurs</li><li>&#8211;infos : pour lister les ip des conteneurs créés</li></ul>



<p>Bien sûr on organise tout cela <strong>avec des fonctions bash</strong>. La plus fournie étant la fonction de création qui notamment :</p>



<ul class="wp-block-list"><li>créé un user du même nom du user qui lance le script</li><li>lui définit un password par défaut à &#8220;password&#8221;</li><li>lui copie votre clef publique dans le authorized_keys</li><li>lance ssh (cf dans notre dockerfile on ne lançait que systemd et pas sshd)</li></ul>



<p>Voilà, j&#8217;ai déjà eu pas mal de retour positifs ou de gens qui ont customisé ce script. Certains ont ajouté d&#8217;autres OS également. A vous de voir et de vous faire plaisir en personnalisant tout cela et en l&#8217;adaptant au mieux à votre  cas d&#8217;utilisation.</p>



<p>Tout <a href="https://gitlab.com/xavki/presentation-ansible-fr/-/tree/master/14-plateforme-dev-docker">le code source est ici</a>.</p>
<p>L’article <a href="https://xavki.blog/un-script-bash-et-docker-pour-vous-aider-a-developper-des-roles-ansible/">Un script bash et docker pour vous aider à développer des rôles ansible</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Faire son premier playbook avec ansible</title>
		<link>https://xavki.blog/faire-son-premier-playbook-avec-ansible/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Thu, 17 Dec 2020 20:03:31 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<guid isPermaLink="false">https://xavki.blog/?p=1110</guid>

					<description><![CDATA[<p>Vous êtes débutant sur ansible ? ou peut être un peu plus avancé mais vous cherchez à vous faire une piqûre de rappel pour remettre les choses en place ? Je vous propose de suivre ma formation ansible en ligne... <a href="https://xavki.blog/faire-son-premier-playbook-avec-ansible/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/faire-son-premier-playbook-avec-ansible/">Faire son premier playbook avec ansible</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-drop-cap">Vous êtes débutant sur ansible ? ou peut être un peu plus avancé mais vous cherchez à vous faire une piqûre de rappel pour remettre les choses en place ? Je vous propose de suivre <strong>ma formation ansible en ligne et totalement gratuite</strong> <a href="https://xavki.blog/ansible-tutoriaux-francais/">via des vidéos youtube</a> mais également à travers les articles de <strong>ce blog devops</strong>.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE - Tutos &amp; Formation  : automatiser vos configurations" width="625" height="352" src="https://www.youtube.com/embed/videoseries?list=PLn6POgpklwWoCpLKOSw3mXCqbRocnhrh-" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Alors depuis quelques vidéos nous avons posé les bases avec :</p>



<ul class="wp-block-list"><li>l&#8217;inventaire</li><li>les groupes</li><li>les hosts</li><li>l&#8217;installation</li><li>la CLI</li></ul>



<p>Nous allons continuer sur ce chemin pour débuter petit à petit avec cet orchestrateur.</p>



<p>Depuis le temps il est peut être venu le moment de faire quelques actions sur nos serveurs.</p>



<h2 class="wp-block-heading">A quoi sert le playbook ??</h2>



<p class="has-drop-cap">C&#8217;est assez simple, dans les définitions et concepts, nous avons vu qu&#8217;il y a deux bulles. Avec d&#8217;un côté l&#8217;inventaire et de l&#8217;autre <strong>les tasks qui sont des actions individuels que l&#8217;on peut rassembler dans des rôles</strong>.</p>



<p>Mais comment savoir quelles tâches sont jouées sur quelles machines cibles ?</p>



<p>C&#8217;est là qu&#8217;intervient <strong>le playbook</strong>. Il permet de coordonner les deux bulles l&#8217;inventaire et les rôles/tasks.</p>



<p>Il s&#8217;ait donc ni plus ni moins d&#8217;un fichier <strong>qui va dire quels groupes ou machines reçoivent quelles actions</strong> ? et bien sûr tout cela en format yaml comme la plupart des fichiers dans ansible.</p>



<p>Le playbook minimum resemble à ceci en terme de contenu :</p>



<pre class="wp-block-preformatted">- name: Mon Playbook !!
  hosts: all
  tasks:
  - name: je debug
    debug:
      msg: "{{ var1 }}"</pre>



<p>Découvrons un peu plus ce que l&#8217;on a écrit :</p>



<ul class="wp-block-list"><li>le nom du playbook &#8220;mon premier playbook&#8221;</li><li>son périmètre ou ses serveurs cibles, donc notre cas le groupe all (c&#8217;est à dire toutes les machines)</li><li>un bloc permettant de décrire les tasks</li><li>le nom de la première tâche &#8220;je debug&#8221;</li><li>l&#8217;appel à un module, en l&#8217;occurence &#8220;debug&#8221;</li><li>les paramètres passés à ce module &#8220;msg&#8221; (pour indiquer un message composé d&#8217;une variable au format jinja).</li></ul>



<p>On est pas mal pour débuter avec notre playbook.</p>



<p>A côté il ne faut pas oublier d&#8217;avoir un inventaire, comme par exemple :</p>



<pre class="wp-block-preformatted">all:
  hosts:
    172.17.0.2:</pre>



<h2 class="wp-block-heading">Comprendre la ligne de commande ansible-playbook ?</h2>



<p class="has-drop-cap">Comment lancer le playbook ? Comprendre est peut être un bien grand mot mais au moins savoir un peu ce que l&#8217;on fait et ce que l&#8217;on peut faire avec ansible et ses playbooks. </p>



<p>Dans ce qui est dessous nous allons parler du binaire ansible-playbook.</p>



<p>Voyons déjà une ligne de commande minimaliste pour lancer ce fichier :</p>



<pre class="wp-block-preformatted">ansible-playbook -i inventory.yml playbook.yml</pre>



<p>Très simple non ? bon généralement il y aura souvent un peu plus d&#8217;options que cela dans votre terminal.</p>



<p>Voici donc quelques options plus ou moins connues (mais même les moins connues sont intéressantes&#8230; le diable se cache dans les détails).</p>



<pre class="wp-block-preformatted">	* -l : réduire le run à certaines machines ou certains groupes de votre inventaire
	* -u : spécifier un user particulier utilisé sur la où les machines distantes
	* -b : become est équivalent à taper sudo devant vos commandes pour élever vos privilèges
	* -k : pour recevoir la demande de saisie du mot de passe pour la connexion ssh
	* -K : le password pour l'élévation de privilège liée au sudo (become)
	* -C : check c'est le dry run... très utile quand on ne connait pas la fréquence des runs ansible
	* -D : diff c'est très utile pour avoir les différences et les modifications de ce que va faire ansible
	* --ask-vault : permet de saisir un password pour déchiffrer les secrets que vous aurez chiffré avec vault
	* --syntax-check : vérfier la syntax
	* --vault-password-file : passer le vault password par un fichier
	* -e : surcharger n'importe quelle variable
	* -f : forks, nombre de parallélisation
	* -t : filtrer sur les tags (--skip-tags)
	* --flush-cache : éviter l'utilisation du cache
	* --step : une tâche à la fois (confirmation via prompt)
	* --start-at-task : commencer à une tâche spécifiquement
	* --list-tags : lister tous les tags rencontrés
	* --list-tasks : liste les tâches qui vont être exécutées</pre>



<p>Là on y voit plus clair. </p>



<p>Et maintenant commençons à jouer avec les fichiers grâce au module file.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE - 11. PLAYBOOK : PREMIERS PAS ET OPTIONS" width="625" height="352" src="https://www.youtube.com/embed/yN29WlhIUrI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Débuter avec le module FILE</h2>



<p>Créer un fichier, un répertoire, leur affecter des droits, des propriétaires&#8230; ce sont des <strong>commandes courrantes en linux </strong>et généralement on apprend cela en débutant : mkdir, touch, chown, chmod, ln&#8230;. Et bien pour ansible c&#8217;est un peu pareil.</p>



<p>Le <strong>module file</strong> peut prendre différents paramètres :</p>



<pre class="wp-block-preformatted">* attribute : définitions des paramètres particuliers d'un fichier : immutabilité etc... cf https://fr.wikipedia.org/wiki/Chattr
* force : pour les liens symboliques (créer même si le fichier source existe pas, la destination existe)
* group/owner : le propriétaire et le groupe du fichier ou du répertoire
* mode : les permissions sous les deux formats : "0755" ou "u=rwx,g=rx,o=rx"
* path : la localisation du fichier ou des répertoires
* recurse : création du chemin intermédiaire si n'existe pas (yes/no), attention cela est valable uniquement pour les répertoires
* src : pour les liens (hard ou symbolique)
* state : le type absent / directory / file / hard / link / touch
		touch > créé le fichier vide
		file > vérifie l'existence et les caractéristiques</pre>



<p>Et donc nous voici prêt à écrire notre première task. Par exemple pour créer un répertoire :</p>



<pre class="wp-block-preformatted">- name: créer un répertoire
  file:
    path: /tmp/xavki/
    state: directory
    owner: root</pre>



<p>Ici ansible va <strong>créer le répertoire</strong> xavki dans /tmp car le state est de <strong>type directory</strong>. Et le propriétaire de ce répertoire sera l&#8217;utilistaur root.</p>



<p>Avec l&#8217;utilisation du mode récursif :</p>



<pre class="wp-block-preformatted">  - name: création du répertoire /tmp/xavki
    file:
      path: /tmp/xavki/1/2/3/4
      recurse: yes
      state: directory
      owner: root
      group: root
      mode: 0755</pre>



<p>Ou encore simplement créer un fichier vide avec touch :</p>



<pre class="wp-block-preformatted">  - name: création du répertoire /tmp/xavki
    file:
      path: /tmp/xavki/1/2/3/4/fichier.txt
      state: touch
      owner: root
      group: root
      mode: 0755</pre>



<p>Ou encore sous forme de lien :</p>



<pre class="wp-block-preformatted">  - name: création du répertoire /tmp/xavki
    file:
      src: /tmp/xavki/1/2/3/4/
      dest: /tmp/symlink
      state: link  #hard
      owner: root
      group: root
      mode: 0755</pre>



<p>Et enfin pour <strong>supprimer des fichiers ou des répertoires</strong>, il suffit d&#8217;utiliser le state absent très courrant dans les modules ansible.</p>



<pre class="wp-block-preformatted">  - name: dir sans idempotence
    file:
      path: /tmp/xavki.txt
      state: absent</pre>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE - 12. MODULE FILE : DIRECTORY, SOFTLINK, DROITS, TOUCH..." width="625" height="352" src="https://www.youtube.com/embed/EmivDVqBqHw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Voilà j&#8217;espère que <a href="https://xavki.blog/ansible-tutoriaux-francais/">cette prise en main de ansible</a> et que <strong>vous pouvez débuter en toute tranquilité à votre rythme</strong>. Je vous rappelle que vous pouvez venir découvrir plus de 900 vidéos sur la chaine xavki avec de nombreuses autres thématiques autour du devops bien sûr. Et retrouvez tous les fichiers de ces présentations sur <a href="https://gitlab.com/xavki/presentation-ansible-fr">le dépôt dédié à ansible</a>.</p>
<p>L’article <a href="https://xavki.blog/faire-son-premier-playbook-avec-ansible/">Faire son premier playbook avec ansible</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ansible, son inventaire&#8230; et son organisation</title>
		<link>https://xavki.blog/ansible-son-inventaire-et-son-organisation/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Sat, 12 Dec 2020 13:16:42 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<guid isPermaLink="false">https://xavki.blog/?p=1106</guid>

					<description><![CDATA[<p>Après avoir découvert la CLI, continuons dans l&#8217;univers d&#8217;ansible pour apprendre à l&#8217;utiliser et bien comprendre ses principes. Eh oui, apprendre ansible c&#8217;est bien mais il faut surtout bien assimiler les concepts et bien organiser. Le but de cet article... <a href="https://xavki.blog/ansible-son-inventaire-et-son-organisation/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/ansible-son-inventaire-et-son-organisation/">Ansible, son inventaire&#8230; et son organisation</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-drop-cap">Après avoir <a href="https://xavki.blog/commencer-avec-la-cli-de-ansible-et-quelques-astuces/">découvert la CLI</a>, continuons dans l&#8217;univers d&#8217;ansible pour apprendre à l&#8217;utiliser et bien comprendre ses principes. Eh oui, <a href="https://xavki.blog/ansible-tutoriaux-francais/">apprendre ansible</a> c&#8217;est bien mais il faut surtout bien assimiler les concepts et bien organiser. Le but de cet article est d&#8217;aider les débutants à trouver leur chemin et de partager les pratiques avec les personnes ayant un niveau un peu plus avancé.</p>



<p>Il existe pas mal de bonnes pratiques pour ne pas se louper et toujours garder le cap. Après quelques années d&#8217;expériences, je pense que dans le domaine de l&#8217;infra as code, il faut toujours <strong>avoir des règles, des principes, des nomenclatures</strong> pour garder l&#8217;objectif de toujours s&#8217;y retrouver et éviter les dérives. Et systématiquement, il y a des dérives et il faudra revenir vers vos règles pour ramener les choses dans l&#8217;ordre.</p>



<p>Mais bon, quand on ne connait pas ou même lorsque l&#8217;on connait juste un peu, ce n&#8217;est pas évident de trouver son cap. Et surtout il faut éviter d&#8217;inventer des choses qui existent déjà.</p>



<p><strong>Rester dans les fondamentaux a aussi un gros avantage</strong>. Si vous intégrez de nouvelles personnes dans vos équipes et qu&#8217;elles connaissent déjà les bonnes pratiques, ce sera encore plus facile pour eux d&#8217;être intégré technologiquement parlant. Et cela est très important en matière d&#8217;IaC car celle-ci décrit votre infrastructure et l&#8217;installation d&#8217;élements importants.</p>



<p>Bref l&#8217;inventaire ou inventory est un élément essentiel dans ansible et dans votre infrastructure. Pour débuter avec ansible, il faut donc bien organiser celui-ci.</p>



<h2 class="wp-block-heading">Inventory ou fichier d&#8217;inventaire, c&#8217;est votre infrastructure</h2>



<p>L&#8217;inventory n&#8217;est pas juste ce fichier mais celui-ci est central. Nous verrons dans le point suivant que l&#8217;inventaire est aussi composé de ses variables que nous nommons&#8230; <strong>variables d&#8217;inventaire</strong>.</p>



<p>L&#8217;inventaire comprend la liste de vos machines, il peut être de 3 types de formats : json, yaml, ini. Personnellement, je préfère le format yaml. Pourquoi ? tout simplement  car :</p>



<ul class="wp-block-list"><li>tous les autres fichiers ansible sont <strong>en format yaml</strong>, donc par souci d&#8217;homogénéité</li><li>également car grâce à son indentation il permet de bien visualiser la hiérarchie des groupes et hosts (même si nous ne sommes pas toujours fan du format yaml).</li></ul>



<p>Une machine est appelée host assez logiquement. Un ou plusieurs hosts peuvent consituer un groupe (group). Les hosts peuvent être décrit par des éléments permettant de les joindre : ip, dns principalement.</p>



<p>Et si vous avez des nomenclatures de serveurs adaptées, vous pourrez même gagner du temps <strong>en utilisant des patterns</strong>, par exemple : srv-bdd-[1-5].</p>



<p>Mettons maintenant tout cela en musique :</p>



<pre class="wp-block-preformatted">all:
  children:
    parent1:
      hosts:
        srv4:
      children:
        enfant1:
          hosts:
            srv1:
            srv2:
        enfant2:
          hosts:
            srv3:
          children
            enfant3:
              hosts:
                srv5:</pre>



<p>Cela pour le format yaml, on a :</p>



<ul class="wp-block-list"><li>le groupe parent de tous qui se nomme toujours ALL (non modifiable)</li><li>le sous-groupe de ALL qui se nomme parent1 (à vous de choisir le nom)</li><li>parent1 est composé d&#8217;un host srv4 et de deux sous-groupes : enfant1 et enfant2</li><li>enfant1 est composé de srv1 et srv2</li><li>enfant2 est composé de srv3 et un autre sous-groupe enfant3</li><li>etc</li></ul>



<p>Et maintenant pour le format ini.</p>



<pre class="wp-block-preformatted">[parent1]
srv4
[enfant1]
srv1
srv2
[enfant2]
srv3
[enfant3]
srv5
[parent1:children]
groupe1
groupe2
[enfant2:children]
enfant3</pre>



<p>Et voilà l&#8217;essentiel. On peut également passer des variables directement dans ce fichier pour les associer à des groupes ou encore à des hosts. Mais je ne recommande pas de faire cela ou surtout il faut le limiter au maximum pour éviter que votre fichier d&#8217;inventaire ansible ne soit imbuvable.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE - 8. INVENTORY : SA STRUCTURE (GROUPES, HOSTS, FORMATS...YAML OU INI ?)" width="625" height="352" src="https://www.youtube.com/embed/D8BUV1RYFjw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div><figcaption>Tutoriels : inventory, sa structure</figcaption></figure>



<h2 class="wp-block-heading">Les variables d&#8217;inventaires ansible</h2>



<p>Pour apprendre ansible, nous le reverrons mais il est important d&#8217;avoir un peu en tête <strong>la hiérarchie des variables ou précédence des variables</strong>&#8230; 22 types de variables au final dont certaines sont plus prioritaires que d&#8217;autres. Rassurez-vous vous n&#8217;avez pas besoin de toutes les connaître et surtout il faut éviter autant que possible de toutes les utiliser pour faciliter la maintenance de votre code.</p>



<p>Les formations ansible passent souvent assez rapidement sur les variables d&#8217;inventaires. C&#8217;est assez logique car sans mise en pratique c&#8217;est toujours délicat à aborder. Néanmoins il faut y passer quelques minutes pour bien débuter.</p>



<p>Notre fichier inventory est donc composé de hosts et de groupes. Nous allons donc pouvoir <strong>définir des variables de groupes et d&#8217;autres spécifiquement pour des hosts</strong>. Une fois que l&#8217;on a dit cela, il se dégage logiquement une hiérarchie ou précédence, les variables de hosts s&#8217;imposent aux variables de groupes. Ainsi, si vous avez un groupe de webserver avec une variable port = 80, si vous avez une exception dans ce groupe vous pourrez surcharger la variable de groupe par la variable du host en question port = 8080, par exemple.</p>



<p>Comment cela s&#8217;organise ?</p>



<p>Assez simplement au même niveau que notre inventory (le fichier), on va retrouver deux répertoires : </p>



<ul class="wp-block-list"><li>group_vars</li><li>host_vars</li></ul>



<p>Une fois dans ces répertoires nous allons pouvoir créer soit : </p>



<ul class="wp-block-list"><li><strong>des répertoires</strong> par groupe avec le nom du groupe ou  par nom de host, vous pourrez ainsi créer plusieurs fichiers car vous avez beaucoup de variables et donc un besoin d&#8217;organiser un maximum</li><li><strong>des fichiers</strong> yaml par nom de groupe ou nom de host car vous avez peu de variables.</li></ul>



<pre class="wp-block-preformatted">├── 00_inventory.yml
├── group_vars
│&nbsp;&nbsp; ├── all.yml
│&nbsp;&nbsp; ├── dbserver.yml
│&nbsp;&nbsp; └── webserver
│&nbsp;&nbsp;     ├── vault.yml
│&nbsp;&nbsp;     └── webserver.yml
└── host_vars
    ├── srv1
    │&nbsp;&nbsp; └── srv1.yml
    └── srv2.yml</pre>



<p>On retrouve bien :</p>



<ul class="wp-block-list"><li>notre fichier d&#8217;inventaire 00_inventory.yml</li><li>nos deux répertoires principaux toujours nommés group_vars et host_vars</li><li>et des sous-répertoires ou fichiers</li></ul>



<p>Et si vous avez différents environnements vous pouvez tendre vers cette organisation assez connue :</p>



<pre class="wp-block-preformatted">├── dev
│&nbsp;&nbsp; ├── 00_inventory.yml
│&nbsp;&nbsp; ├── group_vars
│&nbsp;&nbsp; │&nbsp;&nbsp; ├── all.yml
│&nbsp;&nbsp; │&nbsp;&nbsp; ├── dbserver.yml
│&nbsp;&nbsp; │&nbsp;&nbsp; └── webserver
│&nbsp;&nbsp; │&nbsp;&nbsp;     ├── vault.yml
│&nbsp;&nbsp; │&nbsp;&nbsp;     └── webserver.yml
│&nbsp;&nbsp; └── host_vars
│&nbsp;&nbsp;     ├── srv1
│&nbsp;&nbsp;     │&nbsp;&nbsp; └── srv1.yml
│&nbsp;&nbsp;     └── srv2.yml
├── prod
│&nbsp;&nbsp; ├── 00_inventory.yml
│&nbsp;&nbsp; ├── group_vars
│&nbsp;&nbsp; │&nbsp;&nbsp; ├── all.yml
│&nbsp;&nbsp; │&nbsp;&nbsp; ├── dbserver.yml
│&nbsp;&nbsp; │&nbsp;&nbsp; └── webserver
│&nbsp;&nbsp; │&nbsp;&nbsp;     ├── vault.yml
│&nbsp;&nbsp; │&nbsp;&nbsp;     └── webserver.yml
│&nbsp;&nbsp; └── host_vars
│&nbsp;&nbsp;     ├── srv1
│&nbsp;&nbsp;     │&nbsp;&nbsp; └── srv1.yml
│&nbsp;&nbsp;     └── srv2.yml
└── stage
    ├── 00_inventory.yml
    ├── group_vars
    │&nbsp;&nbsp; ├── all.yml
    │&nbsp;&nbsp; ├── dbserver.yml
    │&nbsp;&nbsp; └── webserver
    │&nbsp;&nbsp;     ├── vault.yml
    │&nbsp;&nbsp;     └── webserver.yml
    └── host_vars
        ├── srv1
        │&nbsp;&nbsp; └── srv1.yml
        └── srv2.yml</pre>



<p>Prenez bien votre temps pour bien comprendre et retenir ce type d&#8217;organisation car vous la retrouverez souvent ou elle pourra repondre à votre besoin. Pour débuter avec l&#8217;inventaire ansible c&#8217;est déjà un très bon début.</p>



<p>Voici une petite démonstration qui va permettre de rendre parlant tout cela avec une variable que l&#8217;on va surcharger à différents endroits.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE - 9. INVENTORY : LES VARIABLES D&#039;INVENTAIRE (HOST_VARS, GROUP_VARS...)" width="625" height="352" src="https://www.youtube.com/embed/UuiRDRIJ-sM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div><figcaption>Tutoriel : les variables d&#8217;inventaire</figcaption></figure>



<p>Mon dépôt <a href="https://gitlab.com/xavki/presentation-ansible-fr/">de formation ansible ici</a>.</p>



<p>Retrouvez également <a href="https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html">la documentation officielle concernant l&#8217;inventory ici</a>.</p>



<p>English version : <a href="https://www.youtube.com/playlist?list=PLWZKNB9waqIXEL-NIapWwIADPtkspe9vk">if you want to learn and start with ansible</a></p>
<p>L’article <a href="https://xavki.blog/ansible-son-inventaire-et-son-organisation/">Ansible, son inventaire&#8230; et son organisation</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Commencer avec la CLI de ansible et quelques astuces</title>
		<link>https://xavki.blog/commencer-avec-la-cli-de-ansible-et-quelques-astuces/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Tue, 08 Dec 2020 19:33:26 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<guid isPermaLink="false">https://xavki.blog/?p=1095</guid>

					<description><![CDATA[<p>Lors de notre précédent article, nous avons débuter avec ansible : principes de base installations possibles premières commandes Nous n&#8217;allons pas encore nous jeter dans le grand bain des rôles et playbooks. Pour un débutant, il est important de comprendre... <a href="https://xavki.blog/commencer-avec-la-cli-de-ansible-et-quelques-astuces/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/commencer-avec-la-cli-de-ansible-et-quelques-astuces/">Commencer avec la CLI de ansible et quelques astuces</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Lors de notre <a href="https://xavki.blog/se-former-et-apprendre-ansible-et-mettre-un-pied-dans-lautomatisation/" data-type="URL" data-id="https://xavki.blog/se-former-et-apprendre-ansible-et-mettre-un-pied-dans-lautomatisation/">précédent article</a>, nous avons débuter avec ansible :</p>



<ul class="wp-block-list"><li>principes de base</li><li>installations possibles</li><li>premières commandes</li></ul>



<p>Nous n&#8217;allons pas encore nous jeter dans le grand bain des rôles et playbooks. Pour un débutant, il est important de <strong>comprendre le fonctionnement de base d&#8217;un outil</strong>. En guise de formation et pour faire un premier pas avec la ligne de commande, je vous propose de pratiquer quelques commandes.</p>



<p>Retrouvez <a href="https://gitlab.com/xavki/presentation-ansible-fr/">mon dépôt ici</a>.</p>



<p>Et la vidéo associée : </p>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE - 7. LIGNE DE COMMANDE : ASTUCES AVEC LES MODULES" width="625" height="352" src="https://www.youtube.com/embed/blOKHSEs6IY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">La plus basique : le ping ansible</h2>



<p class="has-drop-cap">Pour savoir si ansible fonctionne de votre serveur/laptop source vers votre machine cible, nous pouvons utiliser le module ping. Attention, il ne s&#8217;agit pas là de faire un ping réseau ou icmp mais un ping au sens de ansible. En gros, ansible peut-il faire une connexion ssh vers la machine cible d&#8217;où vous le lancer.</p>



<p>Cela induit donc plusieurs paramètres : <strong>le serveur et le user</strong>. Il est important de ne pas oublier ce dernier car c&#8217;est avec lui que sera associé la clef ssh ou le password. L&#8217;utilisateur de départ qui initie la connexion est celui qui lance la commande ansible et l&#8217;utilisateur final peut être précisé par l&#8217;option -u.</p>



<p>Regardons la ligne ci-dessous :</p>



<p><code>ansible -i "node2," all -u vagrant -m ping</code></p>



<p>On a :</p>



<ul class="wp-block-list"><li>-i : qui précise le serveur target/cible, cela peut être un nom dns ou une ip. Important,vous devez rajouter une virgule après ce n&#8217;est pas une erreur de frappe. Suivi de &#8220;all&#8221; qui définit le groupe qui par défaut est all, nous reverrons cela plus tard avec l&#8217;inventaire.</li><li>-u : précise l&#8217;utilsiateur de la machine cible. Si vous utilisez une clef ssh c&#8217;est dans la conf ssh de ce user que vous devez avoir ajouté votre clef publique (dans le fichier authorized_keys).</li><li>-k : si vous n&#8217;avez pas de clef publique ou que vous souhaitez utiliser une connexion ssh via un passowrd vous pouvez le faire avec cette option. Ansible proposera alors de le saisir après avoir lancé la commande.</li></ul>



<p>Vous pouvez forcer l&#8217;utilisation du password ssh de cette manière :</p>



<p><code>ansible -i "node2," all -u vagrant -k --ssh-extra-args="-o 'PreferredAuthentications=password'" -m ping</code></p>



<p>Pour afficher le résultat sur une ligne : </p>



<p><code>ansible -i "node2," all -u vagrant -m ping --one-line</code></p>



<p>Pour utiliser à distance une commande sur le shell distant :</p>



<p><code>ansible -i "node2," all -u vagrant -m command -a uptime</code></p>



<p>Et voilà vous avez lancé un uptime à distance et récupéré son résultat.</p>



<h2 class="wp-block-heading">Poussons plus loin dans l&#8217;utilisation de la CLI</h2>



<p class="has-drop-cap">Bien sûr on peut même aller plus loin <strong>avec la simple ligne de commande ansible</strong>. Je vous propose pour vous former quelques exemples qui vous permettront <strong>de vous aguerrir par la pratique</strong> et sans faire de code pour le moment.</p>



<p>Par exemple, par la ligne de commande nous pouvons définir une variable et afficher son résultat comme si nous étions sur le serveur distant.</p>



<p><code>ansible -i "node2," all -e "var1=xavki" -m debug -a 'msg={{ var1 }}'</code></p>



<p>Ainsi nous passons quelques nouvelles options :</p>



<ul class="wp-block-list"><li>-e : pour définir une variable &#8220;var1&#8221; avec sa valeur &#8220;xavki&#8221;</li><li>-m : pour préciser le module à utiliser, en l&#8217;occurence &#8220;debug&#8221;</li><li>-a : pour définir un paramètre de ce module, nous définissons &#8220;msg&#8221; avec la valeur de var1. Remarquez le double accolade qui est un format jinja, ansible reposant sur python.</li></ul>



<p>Maintenant lançons un shell un peu plus élaboré avec quelques pipe dans ansible :</p>



<p><code>ansible -i "node2," all -u vagrant -m shell -a "ps aux | grep vagrant | wc -l" --one-line</code></p>



<p>On retrouve toujours nos options et nous avons simplement <strong>changé de module en utilisant &#8220;shell&#8221;</strong>. Et on profite du oneline pour l&#8217;output.</p>



<p>Comment installer à distance un serveur nginx :</p>



<p><code>ansible -i "node2," all -b -m apt -a 'name=nginx state=latest'</code></p>



<p>Là encore changement de module pour &#8220;apt&#8221; et définition de deux paramètres de ce module avec -a.</p>



<p>De même pour arrêter ou redémarer le service systemd :</p>



<p><code>ansible -i "node2," all -b -m service -a 'name=nginx state=stopped'</code></p>



<h2 class="wp-block-heading">Et encore un peu plus&#8230;</h2>



<p>Et on peut pousser encore plus loin avec d&#8217;autres onelines très facile à comprendre et utiliser.</p>



<p>Comment faire l&#8217;équivalent d&#8217;un scp avec ansible en une ligne ?</p>



<p><code>ansible -i "node2," all -m copy -a 'src=toto.txt dest=/tmp/titi.txt'</code></p>



<p>On y définit le fichier source et la destination. Mieux qu&#8217;un scp, ansible va faire jouer son idempotence et ne réalisera cette action que si nécessaire. C&#8217;est à dire si le fichier n&#8217;existe pas ou si il est différent du fichier source.</p>



<p>Pour faire l&#8217;inverse et récupérer un fichier d&#8217;une machine distante ?</p>



<p><code>ansible -i "node2," all -m fetch -a 'src=/tmp/titi.txt dest=xavki.txt flat=yes'</code></p>



<p>Cette fois-ci on utilisera le module &#8220;fetch&#8221;, là encore en une ligne pour débuter tranquillement et apprendre à notre rythme.</p>



<p>Mais savez vous que à chaque run, ansible récupère ce que l&#8217;on appelle des facts, ce sont des variables génériques soit nécessaire pour son fonctionnement soit souvent utiles.</p>



<p>Eh bien regardons <strong>les facts disponibles</strong> pour une machine donnée :</p>



<p><code>ansible -i "node2," all -m setup -a "filter=ansible_distribution*"</code></p>



<p>Vous voyez que dans cette exemple, nous filtrons ceux-ci pour ne récupérer que les facts relatifs à la distribution.</p>



<p>Forez vous avec des tutorials ansible sur la chaine Xavki</p>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE - Tutos &amp; Formation  : automatiser vos configurations" width="625" height="352" src="https://www.youtube.com/embed/videoseries?list=PLn6POgpklwWoCpLKOSw3mXCqbRocnhrh-" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<p>L’article <a href="https://xavki.blog/commencer-avec-la-cli-de-ansible-et-quelques-astuces/">Commencer avec la CLI de ansible et quelques astuces</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Se former et apprendre Ansible et mettre un pied dans l&#8217;automatisation</title>
		<link>https://xavki.blog/se-former-et-apprendre-ansible-et-mettre-un-pied-dans-lautomatisation/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Wed, 02 Dec 2020 19:59:47 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<guid isPermaLink="false">https://xavki.blog/?p=1090</guid>

					<description><![CDATA[<p>Vous le savez, la chaine xavki que je tiens, est axée autour du devops. Comment devenir devops ou en acquérir les réflexe ou même la philosophie ? Dans ce domaine, certains outils sont marquants et sortent du lot. L&#8217;infrastructure as... <a href="https://xavki.blog/se-former-et-apprendre-ansible-et-mettre-un-pied-dans-lautomatisation/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/se-former-et-apprendre-ansible-et-mettre-un-pied-dans-lautomatisation/">Se former et apprendre Ansible et mettre un pied dans l&#8217;automatisation</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-drop-cap">Vous le savez, la chaine xavki que je tiens, est axée <strong>autour du devops</strong>. Comment devenir devops ou en acquérir les réflexe ou même la philosophie ? Dans ce domaine, certains outils sont marquants et sortent du lot. L&#8217;infrastructure as code est bien sûr un peu essentielle. De nombreux softs existent dans ce domaine et certains ont gagné des parts ces dernières années. Ansible fait partie de ces outils du parfait devops.</p>



<h2 class="wp-block-heading">Ansible en quelques principes ?</h2>



<p class="has-drop-cap">Les principes d&#8217;ansible en font de lui un des plus faciles à adopter du marché. Totalement gratuit, il se base sur le <strong>langage python</strong> qui a fortement progressé ces dernières années agrandissant sensiblement son périmètre au fur et à mesure des années (IA, big data, statistiques, développement, CMS, framework&#8230;).</p>



<p>En outre, pour faciliter les choses, il se base sur une <strong>méthode de type push</strong>. A savoir que ansible ne nécessite pas d&#8217;agent. Mieux, une simple connexion ssh et python vous permettront de faire l&#8217;essentiel des tâches que vous aurez à réaliser. Un bon point pour les sysadmins qui restent fidèles à leurs scripts bash avec des boucles pour lancer un peu de ssh. Ou encore aux développeurs python qui utilisent paramiko avec une gestion délicate de l&#8217;idempotence&#8230; Ansible peut satisfaire vraiment beaucoup de monde.</p>



<p>Certains apprécieront moins son langage descriptif <strong>à base de yaml</strong>. Néanmoins, il permet de glisser sur la tendance et permet d&#8217;organiser clairement le code sous réserve de respecter les bonnes indentations. Un bon IDE vous y aidera d&#8217;autant plus.</p>



<p>Quelques éléments centraux :</p>



<ul class="wp-block-list"><li><strong>le fichier d&#8217;inventaire (inventory file)</strong> : facile à deviner, il permet de regrouper la liste des machines, des groupes de machines ou même des patterns de serveurs</li><li><strong>les variables d&#8217;inventaire</strong> : il s&#8217;agit des variables spécifiques à des hosts/serveurs ou à des groupes de machines. Elles sont stockées soit dans le fichier d&#8217;inventaire mais plutôt dans des répertoires host_vars et group_vars, respectivement pour les serveurs et les groupes de serveurs.</li><li><strong>le rôle</strong> : regroupe un ensemble de tâches ou d&#8217;actions cohérentes pour installer, configurer etc (par exemple installer un serveur web). Un rôle est constitué notamment d&#8217;actions que l&#8217;on appelle tasks.</li><li><strong>les tasks</strong> : ce sont des tâches individuelles qui utilise un module suivant des paramètres adaptés à la finalité de l&#8217;action</li><li><strong>le playbook</strong> : fichier permettant de faire la jointure entre l&#8217;inventaire et les rôles. Il a une fonction centrale qui permet de dire quel groupe ou quel serveur va avoir tels et tels rôles de joués.</li></ul>



<p>Respecter ces principes est PRIMORDIAL pour la faciliter de l&#8217;organisation du code dans son ensemble. S&#8217;agissant de bonnes pratiques, n&#8217;importe quelle personne ayant suivie une formation ansible pourra s&#8217;y retrouver relativement facilement et pouvoir découvrir votre infra en lisant comme dans un livre (on l&#8217;oubli trop souvent).</p>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Débuter ANSIBLE - 1. Introduction et Présentation" width="625" height="352" src="https://www.youtube.com/embed/Cisg9bLhLkk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Installer le binaire</h2>



<p>Potentiellement il y a 3 choix pour installer ansible :</p>



<ul class="wp-block-list"><li>via le gestionnaire de <strong>module python</strong> comme pip (pip3)</li><li>via le téléchargement de <strong>la source</strong></li><li>via le gestionnaire de <strong>paquets de votre distribution</strong> préférée</li></ul>



<p>Personnellement je préfère de loin cette dernière solution. Mais le contexte peut vous en faire décider autrement.</p>



<p>Sur debian on va simplement faire</p>



<p><code>sudo apt update</code></p>



<p><code>sudo apt install ansible</code></p>



<p>Et voilà le tour est joué. Vous pourrez très bien le faire sur redhat/centos/fedora car le projet ansible est porté par Redhat.</p>



<p>Pour configurer ansible, il est nécessaire de retenir un nom de fichier : ansible.cfg.</p>



<p>Vous pourrez le retrouver dans /etc/ansible/ ou encore dans votre home ou enfin à la racine de votre code (localisation du playbook).</p>



<p>Je vous invite à en découvrir plus <a href="https://www.youtube.com/playlist?list=PLn6POgpklwWoCpLKOSw3mXCqbRocnhrh-">sur la playlist de tutos ansible</a>.</p>



<h2 class="wp-block-heading">Premières commandes en CLI</h2>



<p>Si vous avez installé ansible, vous êtes prêts à faire feu !!! Sauf si vous n&#8217;avez pas créé votre clef ssh. Dans ce cas, je vous propose une petite piqure de rappel <a href="https://www.youtube.com/watch?v=dpDQ94huxmI&amp;list=PLn6POgpklwWoCpLKOSw3mXCqbRocnhrh-&amp;index=4">ici</a>.</p>



<p>Bref comment débuter et faire vos premières commandes ?</p>



<p>Pour pinguer les machines cibles.</p>



<p><code>ansible -i "node2," all -u vagrant -m ping</code></p>



<p>Attention, on parle d&#8217;un ping au sens ansible à savoir réussir une connexion ssh globalement.</p>



<p>-i : permet de préciser le fichier d&#8217;inventaire mais comme nous ne l&#8217;avons pas encore vu et que notre cible est une seule et unique machine on va simplement préciser cette machine entre double quote MAIS n&#8217;oubliez pas la virgule et le all (pour indiquer que cette machine fait partie du groupe all.</p>



<p>-u : permet de préciser l&#8217;utilisateur distant pour notre ssh ( &lt;user>@&lt;server>)</p>



<p>-m : permet de préciser l&#8217;utilisation d&#8217;un module, en l&#8217;occurence le module ping.</p>



<p>Dans notre cas nous avons une clef ssh mais on peut également faire la même chose par un password ssh :</p>



<p><code>ansible -i "node2," all -u vagrant -k -m ping</code></p>



<p>et si vous voulez forcer le fonctionnement par password pour une raison précise :</p>



<p><code>ansible -i "node2," all -u vagrant -k --ssh-extra-args="-o 'PreferredAuthentications=password'" -m ping</code></p>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="ANSIBLE- 6. LA COMMANDE ANSIBLE EN CLI" width="625" height="352" src="https://www.youtube.com/embed/JPohVKUEnbs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<p>L’article <a href="https://xavki.blog/se-former-et-apprendre-ansible-et-mettre-un-pied-dans-lautomatisation/">Se former et apprendre Ansible et mettre un pied dans l&#8217;automatisation</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Raspberry et Ansible : gestion des clefs SSH et suppression du user par défaut</title>
		<link>https://xavki.blog/raspberry-et-ansible-gestion-des-clefs-ssh-et-suppression-du-user-par-defaut/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Sun, 23 Feb 2020 10:01:15 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<category><![CDATA[Raspberry]]></category>
		<guid isPermaLink="false">https://xavki.blog/?p=1009</guid>

					<description><![CDATA[<p>Précédemment, nous avions découvert comment créer nos users avec ansible. Mais nous avons quelques lacunes avec cette gestion minimaliste des users. En effet, d&#8217;une part la connexion ne se fait que par mot de passe (ce n&#8217;est pas pratique et... <a href="https://xavki.blog/raspberry-et-ansible-gestion-des-clefs-ssh-et-suppression-du-user-par-defaut/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/raspberry-et-ansible-gestion-des-clefs-ssh-et-suppression-du-user-par-defaut/">Raspberry et Ansible : gestion des clefs SSH et suppression du user par défaut</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-drop-cap">Précédemment, nous avions découvert comment créer nos users <a href="https://xavki.blog/ansible-tutoriaux-francais/">avec ansible</a>. Mais nous avons quelques lacunes avec cette <strong>gestion minimaliste des users</strong>. En effet, d&#8217;une part la connexion ne se fait que par mot de passe (ce n&#8217;est pas pratique et très sécurisé). D&#8217;autre part, l&#8217;existence du user pi est une vraie faille de sécurité. Toute installation d&#8217;un raspbian dispose systématiquement de ce user et bien sûr avec le même mot de passe (pratique mais pas sécurisé tout ça).</p>



<h2 class="wp-block-heading">Création de nos users</h2>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Raspberry Pi - 2. Ansible : gestion des passwords des users avec vault" width="625" height="352" src="https://www.youtube.com/embed/I1tcLub6_-o?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Pour cela nous allons<strong> industrialiser tout cela avec Ansible.</strong> Pour appel, nous avions nos mots de passe stockés sous les varaiables de group_vars/all/all.yml avec ceci :</p>



<pre class="wp-block-preformatted">users_password_xavki: "{{ vault_users_password_xavki }}"
users_password_xavier: "{{ vault_users_password_xavier }}"
</pre>



<p>Et ces variables faisaient appel à un fichier vault situé au même endroit dans group_vars/all/vault.yml mais chiffré par un mot de passe :</p>



<pre class="wp-block-preformatted">$ANSIBLE_VAULT;1.1;AES256
613362633865666266653364373533323263663137623536316431313933653331336239623437613232343965386434353761386436333663303533653862350a333939363463653663656563643966653035353666623165323434613434616334313163616663643763396635313636323666356437393665366339636561650a623032376634633634353132343539613962306132373230343232306234346664336231343866326532363930303566313262376264383231306664386462303461646432646433386535333432643337613138653365396132386261373362366463646564373830656265613239366334636361336462313039323064666432646161326463666635366663313539303136313965623430386435303466386634663161393438363134376138393137373033323565353065383465356638</pre>



<p>Maintenant créons un répertoire dédié au <strong>stockage de nos clefs publiques</strong> (PUBLIQUES j&#8217;insiste) : files. Il s&#8217;agit des clefs que nous allons diffuser et installer dans la home de nos users. S&#8217;agissant de clefs publiques, un chiffrement n&#8217;est pas nécessaire, seule la clef privée est d&#8217;une importance capitale.</p>



<p>Maintenant modifions notre playbook de création des users :</p>



<pre class="wp-block-preformatted">- name: deploy users
  hosts: all
  become: yes
  vars:
    users_admin:
    - { name: "xavki", password: "{{ vault_users_password_xavki }}" }
    users_no_admin:
    - { name: "xavier", password: "{{ vault_users_password_xavier }}" }
  tasks:
  - name: create group admin
    group:
      name: "admin"
      state: present

  - name: create admin user accounts
    user:
      name: "{{ item.name }}"
      password: "{{ item.password | password_hash('sha512')}}"
      groups: "admin"
    with_items:
    - "{{ users_admin }}"
    no_log: true
 
  - name: create standard user accounts
    user:
      name: "{{ item.name }}"
      password: "{{ item.password | password_hash('sha512')}}"
    with_items:
    - "{{ users_no_admin }}"
    no_log: true

  - name: add authorized keys
    authorized_key:
      user: "{{ item.name }}"
      key: "{{ lookup('file', 'files/'+ item.name + '.key.pub') }}"
    with_items: 
    - "{{ users_admin }}"
    - "{{ users_no_admin }}"
 
  - name: "Allow admin users to sudo without a password"
    lineinfile:
      dest: "/etc/sudoers"
      state: "present"
      regexp: "^%sudo"
      line: "%admin ALL=(ALL) NOPASSWD: ALL"
</pre>



<p>La tâche &#8220;add authorized keys&#8221; nous permet donc de récupérer ces clefs et de les placer par défaut dans la hoem de chaque users et selon la bonne pratique avec un répertoire &#8220;.ssh&#8221;.</p>



<p>Voici donc pour le déploiement de nos clefs correspondantes pour chaque utilisateurs.</p>



<p>Retrouvez <a href="https://gitlab.com/xavki/raspberry-tricks/-/tree/master/2-users-password/ansible">les fichiers ici</a>.</p>



<h2 class="wp-block-heading">Suppression du user PI</h2>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Raspberry Pi - 3. Ansible : suppression du user Pi et roles" width="625" height="352" src="https://www.youtube.com/embed/RHSjqctIt1Y?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Pour supprimer un utilisateur, la démarche est très simple, il suffit d&#8217;ajouter la tâches suivante :</p>



<pre class="wp-block-preformatted">- name: remove pi user
  user:
    name: "pi"
    state: absent</pre>



<p>Profitons-en pour faire un peu d&#8217;organisation et de bonnes pratiques ansible. Pour cela nous allons utliser le principe de rôle. Un <strong>rôle est une sorte de module/librairie/fonction</strong> qui peut être appelé autant que nécessaire.</p>



<p>Pour cela nous allon créer un répertoire &#8220;roles&#8221; à la racine de notre ansible et taper la commande :</p>



<pre class="wp-block-preformatted">mkdir roles &amp;&amp; cd roles
ansible-galaxy init users</pre>



<p>Cette commande créée toute la structure nécessaire pour créer le contenu d&#8217;un rôle. A l&#8217;heure actuelle ce qui nous intéresse c&#8217;est uniquement le répertoire task et son fichier main.yml. C&#8217;ets la première chose qui est appelé quand on lance un rôle. Donc dans ce fichier nous recopions le conteneur de notre users.yml.</p>



<p>Ensuite il nous faut modifier notre playbook pour appeler le rôle et non plus les tâches une à une :</p>



<pre class="wp-block-preformatted">- name: deploy users
  become: yes
  hosts: all
  roles:
  - users</pre>



<p>Et voilà le tour est joué. il ne reste plus qu&#8217;à jouer le playbook :</p>



<pre class="wp-block-preformatted">ansible-playbook -i list_servers.yml -u xavki users.yml</pre>



<p>Retrouvez <a href="https://gitlab.com/xavki/raspberry-tricks/-/tree/master/3-remove-pi-users/ansible">les fichiers ici.</a></p>
<p>L’article <a href="https://xavki.blog/raspberry-et-ansible-gestion-des-clefs-ssh-et-suppression-du-user-par-defaut/">Raspberry et Ansible : gestion des clefs SSH et suppression du user par défaut</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ansible &#8211; Comment installer la stack haproxy, consul et consult template de manière orchestrée ?</title>
		<link>https://xavki.blog/ansible-comment-installer-la-stack-haproxy-consul-et-consult-template-de-maniere-orchestree/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Tue, 02 Jul 2019 19:05:02 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<guid isPermaLink="false">http://xavki.blog/?p=929</guid>

					<description><![CDATA[<p>Ansible est pratiquement inévitable à l&#8217;heure actuelle. Il faut dire que cet orchestrateur est surement l&#8217;un des plus simples à utiliser et à apprendre. Pour apprendre à l&#8217;utiliser, je vous propose d&#8217;installer une stack très utile : haproxy : reverse-proxy... <a href="https://xavki.blog/ansible-comment-installer-la-stack-haproxy-consul-et-consult-template-de-maniere-orchestree/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/ansible-comment-installer-la-stack-haproxy-consul-et-consult-template-de-maniere-orchestree/">Ansible &#8211; Comment installer la stack haproxy, consul et consult template de manière orchestrée ?</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Ansible est pratiquement inévitable à l&#8217;heure actuelle. Il faut dire <a href="https://xavki.blog/ansible-tutoriaux-francais/">que cet orchestrateur</a> est surement l&#8217;un des plus simples à utiliser et à apprendre.</p>
<p>Pour apprendre à l&#8217;utiliser, je vous propose d&#8217;installer une stack très utile :</p>
<ul>
<li>haproxy : reverse-proxy et load-balancer très réputé</li>
<li>consul : la registry de service dont je vous ai déjà parlé sur le blog et la chaine youtube</li>
<li>consul-template : un binaire qui va permettre de modifier automatiquement la conf de haproxy en cas de modification dans la composition et l&#8217;état des services de consul</li>
</ul>
<p>En 9 courtes vidéos, vous allez pouvoir faire coup double :</p>
<ol>
<li><a href="https://www.youtube.com/watch?v=x6jtqPmquOU&amp;t=188s">Installation de haproxy</a> : rôle, apt</li>
<li><a href="https://www.youtube.com/watch?v=DD9xKyOKuW8&amp;t=3s">Installation de consul</a> : unarchive, wget</li>
<li><a href="https://www.youtube.com/watch?v=cO4nN_bVCLI">Création du user consul</a> : user, group</li>
<li><a href="https://www.youtube.com/watch?v=ZxabhjYL2PE">Structurer ses tâches</a> : include task</li>
<li><a href="https://www.youtube.com/watch?v=heyyyVtRLiQ">Gestion des configurations</a> : templates</li>
<li><a href="https://www.youtube.com/watch?v=QA3QOerqcdc&amp;t=62s">Création d&#8217;une application de test</a></li>
<li><a href="https://www.youtube.com/watch?v=NaqMg-Pt6HQ&amp;t=89s">Mise en place d&#8217;un service système D</a></li>
<li><a href="https://www.youtube.com/watch?v=lHnWgjwiuIc">Installation du binaire consul-template</a></li>
<li><a href="https://www.youtube.com/watch?v=wgvv8VBzqCo&amp;t=16s">Finalisation de consul-template</a> : utilisation de blockinfile, du jinja dans du jinja</li>
</ol>
<p>Grâce à ces vidéos, vous allez pouvoir rendre dynamique votre configuration haproxy et réaliser un haproxy reload si nécessaire.</p>
<p>L’article <a href="https://xavki.blog/ansible-comment-installer-la-stack-haproxy-consul-et-consult-template-de-maniere-orchestree/">Ansible &#8211; Comment installer la stack haproxy, consul et consult template de manière orchestrée ?</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[Ansible] &#8211; comment utiliser les gather_facts et tenir à jour un début de cmdb ?</title>
		<link>https://xavki.blog/ansible-comment-utiliser-les-gather_facts-et-tenir-a-jour-un-debut-de-cmdb/</link>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Mon, 26 Nov 2018 09:41:56 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<guid isPermaLink="false">http://xavki.blog/?p=829</guid>

					<description><![CDATA[<p><img width="640" height="400" src="https://xavki.blog/wp-content/uploads/2018/10/fiche-cmdb.png" class="attachment- size- wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" loading="lazy" srcset="https://xavki.blog/wp-content/uploads/2018/10/fiche-cmdb.png 640w, https://xavki.blog/wp-content/uploads/2018/10/fiche-cmdb-300x188.png 300w" sizes="auto, (max-width: 640px) 100vw, 640px" />Ansible regorge d&#8217;astuces qu&#8217;il faut engranger pour pouvoir aller plus loin et ne pas simplement installer des paquets sur des machines distantes. Par exemple, nous allons voir aujourd&#8217;hui une valorisation des gather_facts de ansible. Sur puppet, je crois que la... <a href="https://xavki.blog/ansible-comment-utiliser-les-gather_facts-et-tenir-a-jour-un-debut-de-cmdb/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/ansible-comment-utiliser-les-gather_facts-et-tenir-a-jour-un-debut-de-cmdb/">[Ansible] &#8211; comment utiliser les gather_facts et tenir à jour un début de cmdb ?</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="640" height="400" src="https://xavki.blog/wp-content/uploads/2018/10/fiche-cmdb.png" class="attachment- size- wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" loading="lazy" srcset="https://xavki.blog/wp-content/uploads/2018/10/fiche-cmdb.png 640w, https://xavki.blog/wp-content/uploads/2018/10/fiche-cmdb-300x188.png 300w" sizes="auto, (max-width: 640px) 100vw, 640px" /><p>Ansible regorge d&#8217;astuces qu&#8217;il faut engranger pour pouvoir aller plus loin et ne pas simplement installer des paquets sur des machines distantes. Par exemple, nous allons voir aujourd&#8217;hui une valorisation des gather_facts <a href="https://xavki.blog/ansible-tutoriaux-francais/">de ansible</a>. Sur puppet, je crois que la même chose est réalisable avec facter.</p>
<p>Gather_facts c&#8217;est la possibilité d&#8217;utiliser des variables d&#8217;environnement ansible. Ce sont principalement des caractéristiques de la machine (interface, os&#8230;). Ces données vous vous en doutez seraient bien utiles dans une cmdb (centralisation d&#8217;informations de votre parc de machine).</p>
<p>Pour commencer cette démos nous allons commencer par créer quelques machines à l&#8217;aide de <a href="https://xavki.blog/2018/09/21/dockeransible-comment-se-creer-un-mini-datacenter-de-test-sans-vm-parc-de-conteneurs/">mon script maison</a> (vous pouvez <a href="https://www.youtube.com/watch?v=zd_Ch0W3RAM">aussi le découvrir en vidéo désormais</a>). Dans mon cas, j&#8217;ai 2 vm debian qui fonctionnent avec du ssh (merci docker).</p>
<pre>└─ $ ▶ ./deploy-centre-sans-proxy-v2.sh --infos
#### Récap des conteneurs de tests ####
=&gt; /oki-deb-vmparc3 - 172.17.0.3 - Utilisteur : oki / mdp:password
=&gt; /oki-deb-vmparc2 - 172.17.0.2 - Utilisteur : oki / mdp:password</pre>
<p>Maintenant nous allons configurer notre inventory hosts.yml très simplement :</p>
<pre>all:  hosts:    172.17.0.2:    172.17.0.3:</pre>
<h2>Objectif ?</h2>
<p>Notre souhait c&#8217;est d&#8217;utiliser les gather_facts et faire en sorte que ansible centralise tout cela sous forme de fichiers.html. Ainsi nous pourrons faire de la datavisualisation avec un apache installé localement (attention c&#8217;est pour la démo, c&#8217;est très moyen d&#8217;installer un serveur web sur une machine qui a la main sur tout votre parc).</p>
<p>Enfin, grâce à notre apache on pourra afficher dans un navigateur web. Et vous verrez ce qui compte c&#8217;est le principe car derrière c&#8217;est assez facile d&#8217;avoir des idées pour compléter tout cela pour avoir un bon début de cmdb.</p>
<h2>Comment lister les gather_facts à notre dispostion ?</h2>
<p>Les gather_facts sont accessibles via le module setup de ansible. Donc pour consulter toutes ces variables voici la commande à réaliser :</p>
<pre>ansible all - i hosts.yml -u oki -m "setup"</pre>
<p>La liste est assez longue et c&#8217;est plutôt une bonne nouvelle.</p>
<p>Faisons nos courses et retenons les variables :</p>
<ul>
<li>inventory_hostname</li>
<li>ansible_default_ipv4.alias</li>
<li>ansible_architecture</li>
<li>ansible_distribution</li>
<li>ansible_distribution_version</li>
</ul>
<p>Et on met tout cela en forme dans un template jinja2 pour générer à terme un fichier html :</p>
<pre>&lt;h1&gt;Machine : {{ inventory_hostname }}&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Interfaces : {{ ansible_default_ipv4.alias }}&lt;/li&gt;
&lt;li&gt;Architecture : {{ ansible_architecture }}&lt;/li&gt;
&lt;li&gt;OS : {{ ansible_distribution }}&lt;/li&gt;
&lt;li&gt;Version : {{ ansible_distribution_version }}&lt;/li&gt;
&lt;/ul&gt;</pre>
<h2>Maintenant le playbook !</h2>
<p>Voici le contenu de notre répertoire :</p>
<pre>.
├── hosts.yml
├── playbook-cmdb.yml
└── templates
└── listing_ipv4.html.j2</pre>
<p>Editons donc le playbook-cmdb.yml de la manière suivante :</p>
<pre>---
- name: "[IP v4 listing]"
  hosts: all
  gather_facts: yes
  tasks:
    - name: "[IP v4 listing] - generate html"
      template:
        src: listing_ipv4.html.j2
        dest: "/var/www/html/{{ inventory_hostname }}.html"
      connection: local</pre>
<p>Première chose on spécifie l&#8217;utilisation des gather_acts. Ensuite on utilise le module template pour faire appel au fichier jinja2. Puis on indique comme destination le répertoire de notre apache /var/www/html/ (de la machine master host). C&#8217;est aussi pour cela que nous spécifions connection : local.</p>
<p>Maintenant lançons la commande ansible-playbook :</p>
<pre>ansible-playbook -i hosts.yml -u oki playbook-cmdb.yml</pre>
<p>Et bingo :</p>
<pre>PLAY [[IP v4 listing]] *******************************

TASK [Gathering Facts] *******************************
ok: [172.17.0.3]
ok: [172.17.0.2]

TASK [[IP v4 listing] - generate html] ***************
changed: [172.17.0.3]
changed: [172.17.0.2]

PLAY RECAP *******************************************
172.17.0.2 : ok=2 changed=1 unreachable=0 failed=0 
172.17.0.3 : ok=2 changed=1 unreachable=0 failed=0</pre>
<p>Supprimons l&#8217;index de notre apache local : rm -f /var/www/html/index.html</p>
<p>Remarque : j&#8217;ai confié les droits de ce réprtoire à oki pour cet exercice</p>
<p>Et voici le résultat, une fiche par machine :</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-830" src="http://xavki.blog/wp-content/uploads/2018/10/fiche-arbre.png" alt="fiche-arbre" width="640" height="400" srcset="https://xavki.blog/wp-content/uploads/2018/10/fiche-arbre.png 640w, https://xavki.blog/wp-content/uploads/2018/10/fiche-arbre-300x188.png 300w" sizes="auto, (max-width: 640px) 100vw, 640px" /></p>
<p>Puis la fiche de la machine :</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-831" src="http://xavki.blog/wp-content/uploads/2018/10/fiche-cmdb.png" alt="fiche-cmdb.png" width="640" height="400" srcset="https://xavki.blog/wp-content/uploads/2018/10/fiche-cmdb.png 640w, https://xavki.blog/wp-content/uploads/2018/10/fiche-cmdb-300x188.png 300w" sizes="auto, (max-width: 640px) 100vw, 640px" /></p>
<p>C&#8217;est bon tout ça non ? On comprend mieux l&#8217;intérêt des facts avec ce genre d&#8217;outils d&#8217;orchestration. Et ne vous inquiétez pas vous pouvez aisément pousser les fichier vers une autre machine qui portera un service apache de manière isolée.</p>
<p>L’article <a href="https://xavki.blog/ansible-comment-utiliser-les-gather_facts-et-tenir-a-jour-un-debut-de-cmdb/">[Ansible] &#8211; comment utiliser les gather_facts et tenir à jour un début de cmdb ?</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ansible &#8211; installer un applicatif (ex. WordPress)</title>
		<link>https://xavki.blog/ansible-installer-un-applicatif-ex-wordpress/</link>
					<comments>https://xavki.blog/ansible-installer-un-applicatif-ex-wordpress/#comments</comments>
		
		<dc:creator><![CDATA[xavki]]></dc:creator>
		<pubDate>Wed, 21 Nov 2018 05:38:17 +0000</pubDate>
				<category><![CDATA[Ansible]]></category>
		<guid isPermaLink="false">http://xavki.blog/?p=880</guid>

					<description><![CDATA[<p><img width="600" height="600" src="https://xavki.blog/wp-content/uploads/2018/09/ansible_logo.png" class="attachment- size- wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" loading="lazy" srcset="https://xavki.blog/wp-content/uploads/2018/09/ansible_logo.png 600w, https://xavki.blog/wp-content/uploads/2018/09/ansible_logo-150x150.png 150w, https://xavki.blog/wp-content/uploads/2018/09/ansible_logo-300x300.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" />Poursuivons notre découverte de ansible avec l&#8217;installation d&#8217;un applicatif en l&#8217;occurence wordpress. Chaque applicatif possède toutefois des manières différentes de s&#8217;installer, il s&#8217;agit juste là de prendre un exemple pour se faire la main. Vous pouvez retrouver cet article en... <a href="https://xavki.blog/ansible-installer-un-applicatif-ex-wordpress/" class="suite"><i class="fal fa-long-arrow-right"></i></a></p>
<p>L’article <a href="https://xavki.blog/ansible-installer-un-applicatif-ex-wordpress/">Ansible &#8211; installer un applicatif (ex. WordPress)</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="600" height="600" src="https://xavki.blog/wp-content/uploads/2018/09/ansible_logo.png" class="attachment- size- wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" loading="lazy" srcset="https://xavki.blog/wp-content/uploads/2018/09/ansible_logo.png 600w, https://xavki.blog/wp-content/uploads/2018/09/ansible_logo-150x150.png 150w, https://xavki.blog/wp-content/uploads/2018/09/ansible_logo-300x300.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /><p>Poursuivons notre découverte de ansible avec l&#8217;installation d&#8217;un applicatif en l&#8217;occurence wordpress. Chaque applicatif possède toutefois des manières différentes de s&#8217;installer, il s&#8217;agit juste là de prendre un exemple pour se faire la main.</p>
<p>Vous pouvez retrouver cet article en vidéo :</p>
<p>&nbsp;</p>
<p>La première chose à faire dans notre rôle est de vérifier si wordpress existe déjà :</p>
<pre>- name: "[WORDPRESS] - check if exist"
  stat: 
    path: "/var/www/html/wordpress/"
  register: check_wordpress
</pre>
<p>Avec stat, nous vérifions si le répertoire wordpress est déjà là et nous alimentons l&#8217;état de ce répertoire dans une variable avec register. Notre variable s&#8217;appelle donc check_wordpress.</p>
<p>Utilisons maintenant cette variable pour conditonner à celle-ci le téléchargement de l&#8217;archive tar.gz.</p>
<pre>- name: "[WORDPRESS] - download tar.gz"
  unarchive:
    src: "{{ wordpress_source }}"
    dest: "/var/www/html/"
    remote_src: yes
  when: check_wordpress.stat.exists == False</pre>
<p>Avec unarchive, nous procédons au téléchargement en ligne car la variable wordpress_source est une url de téléchargement. Par ailleurs pour pouvoir télécharger une url on utilise remote_src. Et enfin notre condition avec le when.</p>
<p>Après nous procédons à la suppression de index.html que notre apache à installer par défaut.</p>
<pre>- name: "[WORDPRESS] - index.html"
  file: 
    path: "/var/www/html/index.html"
    state: absent
</pre>
<p>Pour cela nous utilisons le module file avec un state à absent.</p>
<p>A la première installation, le fichier wp-config.php se nomme wp-config-sample.php. Nous vérifions donc si nous sommes dans ce cas.</p>
<pre>- name: "[WORDPRESS] - exist wp-config-sample.php"
  stat:
    path: "/var/www/html/wordpress/wp-config-sample.php"
  register: check_sample</pre>
<p>Nous procédons comme pour le répertoire wordpress en vérifiant la présence de wp-config-sample.php.</p>
<p>Si c&#8217;est le cas nous le renommons.</p>
<pre>- name: "[WORDPRESS] - rename wp-config-sample.php"
  command: mv /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php 
  when: check_sample.stat.exists == True</pre>
<p>Enfin nous procédons à  la modification de plusieurs ligne dans ce même fichier pour configurer celui-ci en fonction de notre serveur base de données.</p>
<pre>- name: "[WORDPRESS] - config wp-config.php"
  lineinfile:
    dest: "/var/www/html/wordpress/wp-config.php"
    regexp: "{{ item.search }}"
    line: "{{ item.new }}"
    backrefs: yes
  with_items:
    - {'search': '^(.*)database_name_here(.*)$', 'new': '\1{{ mysql_db }}\2'}
    - {'search': '^(.*)username_here(.*)$', 'new': '\1{{ mysql_user }}\2'}
    - {'search': '^(.*)password_here(.*)$', 'new': '\1{{ mysql_password }}\2'}</pre>
<p>Pour chaque ligne définie dans le with_items, nous recherchons un élément (ex : database_name_here) et compturons les éléments présents avant et après. Ensuite nous remplaçons cette ligne par une nouvelle ligne contenant le premier élément capturé puis notre variable puis le deuxième élément capturé.</p>
<p>Et voilà pour notre installation de wordpress. Vous pouvez <a href="https://github.com/priximmo/wordpress-etape1/blob/master/roles/wordpress/tasks/install_wordpress.yml">retrouver tout le code sur mon github</a>.</p>
<p>L’article <a href="https://xavki.blog/ansible-installer-un-applicatif-ex-wordpress/">Ansible &#8211; installer un applicatif (ex. WordPress)</a> est apparu en premier sur <a href="https://xavki.blog">Xavki</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://xavki.blog/ansible-installer-un-applicatif-ex-wordpress/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
