diff --git a/README.md b/README.md index 3edfbf7..dec814e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,122 @@ -# role_modele +# role_dnsmasq -Modèle \ No newline at end of file +Ce rôle permet d'installer et configurer dnsmasq. + +## Variables + +### dnsmasq_conf_domain + +Nom de domain utilisé pour qualifier les noms courts. + +*Valeur par défaut: aucune* + +### dnsmasq_conf_servers + +Liste d'adresses IP auxquelles les requêtes DNS sont transmises si dnsmasq ne porte pas le domaine. + +*Valeur par défaut: aucune* + +### dnsmasq_servers + +Liste d'IP ou de noms d'hôtes servant de serveur DNS. + +*Valeur par défaut: aucune* + +### dnsmasq_host_ipv4 ou dnsmasq_host_ipv6 + +Liste d'IP de l'hôte. + +*Valeur par défaut: aucune* + +### dnsmasq_host_aliases + +Liste d'alias pour un hôte (*host_groups*). + +*Valeur par défaut: aucune* + +### dnsmasq_client_filename + +Nom du fichier pour le client. + +*Valeur par défaut: `{{ inventory_hostname }}`* + +### dnsmasq_client_hostname + +Nom d'hôte du client. + +*Valeur par défaut: `{{ inventory_hostname }} {{ inventory_hostname_short }}`* + +## Exemple d'utilisation + +### inventory.yml + +```yaml +--- + +all: + hosts: + host1.ykn.local: + host2.ykn.local: + children: + dnsservers: + hosts: + dnsmasq1.ykn.local: + dnsmasq2.ykn.local: +``` + +### group_vars/all.yml + +```yaml +--- + +dnsmasq_servers: "{{ groups['dnsservers'] }}" +``` + + +### group_vars/dnsservers.yml + +```yaml +--- + +dnsmasq_conf_domain: ykn.local +dnsmasq_conf_servers: + - 127.0.0.1#53000 + - ::1#53000 +``` + +### host_vars/host1.ykn.local.yml + +```yaml +--- + +dnsmasq_host_ipv4: [192.168.50.6] +dnsmasq_host_ipv6: [fd00:ff50::d006] + +dnsmasq_host_alias: + - monsuperhost1.ykn.local + - monsuperhost1 + - toto.ykn.local + - toto +``` + +### playbook.yml + +```yaml +--- + +- name: Déployer les serveurs DNS + hosts: dnsservers + roles: + - name: stubby + - name: dnsmasq + - name: nftables + +- name: Gérer l'enregistrement DNS + hosts: 'all:!dnsservers' + gather_facts: false + tasks: + - name: Inclure le rôle + ansible.builtin.include_role: + name: dnsmasq + tasks_from: client +``` diff --git a/defaults/main.yml b/defaults/main.yml new file mode 100644 index 0000000..5fbf383 --- /dev/null +++ b/defaults/main.yml @@ -0,0 +1,14 @@ +--- +# defaults file for dnsmasq + +dnsmasq_conf_domain: "" +dnsmasq_conf_servers: [] + +dnsmasq_servers: [] + +dnsmasq_host_ipv4: [] +dnsmasq_host_ipv6: [] +dnsmasq_host_aliases: [] + +dnsmasq_client_filename: "{{ inventory_hostname }}" +dnsmasq_client_hostname: "{{ inventory_hostname }} {{ inventory_hostname_short }}" diff --git a/handlers/main.yml b/handlers/main.yml new file mode 100644 index 0000000..7fb2eb3 --- /dev/null +++ b/handlers/main.yml @@ -0,0 +1,18 @@ +--- +# handlers file for dnsmasq + +- name: Recharger dnsmasq.service + become: true + ansible.builtin.systemd: + state: reloaded + name: dnsmasq.service + +- name: Recharger dnsmasq.service sur les serveurs + become: true + ansible.builtin.systemd: + state: reloaded + name: dnsmasq.service + loop: "{{ dnsmasq_servers }}" + loop_control: + loop_var: dnsserver + delegate_to: "{{ dnsserver }}" diff --git a/meta/main.yml b/meta/main.yml index f42fb14..29fb6a3 100644 --- a/meta/main.yml +++ b/meta/main.yml @@ -1,14 +1,15 @@ galaxy_info: + namespace: ykn author: pulsar89.5 - description: Rôle modèle + description: Rôle de déploiement de dnsmasq license: GPL-3.0-or-later - min_ansible_version: 2.1 + min_ansible_version: '2.1' platforms: - - name: Debian (LXD) + - name: Debian versions: - - 11 + - all dependencies: [] diff --git a/tasks/client.yml b/tasks/client.yml new file mode 100644 index 0000000..d5e661a --- /dev/null +++ b/tasks/client.yml @@ -0,0 +1,31 @@ +--- +# tasks file for security + +- name: Déployer le fichier lié à l'hôte + ansible.builtin.template: + owner: dnsmasq + group: root + mode: u=rw,g=r,o=r + src: "{{ role_path }}/templates/host.conf.j2" + dest: /srv/dnsmasq/{{ dnsmasq_client_filename }}.conf + when: dnsmasq_servers | length > 0 + tags: creation + loop: "{{ dnsmasq_servers }}" + loop_control: + loop_var: dnsserver + delegate_to: "{{ dnsserver }}" + become: true + notify: Recharger dnsmasq.service sur les serveurs + +- name: Supprimer le fichier lié à l'hôte + ansible.builtin.file: + path: /srv/dnsmasq/{{ dnsmasq_client_filename }}.conf + state: absent + when: dnsmasq_servers | length > 0 + tags: [destruction, never] + loop: "{{ dnsmasq_servers }}" + loop_control: + loop_var: dnsserver + delegate_to: "{{ dnsserver }}" + become: true + notify: Recharger dnsmasq.service sur les serveurs diff --git a/tasks/configuration.yml b/tasks/configuration.yml new file mode 100644 index 0000000..9147453 --- /dev/null +++ b/tasks/configuration.yml @@ -0,0 +1,22 @@ +--- +# tasks file for security + +- name: Configurer dnsmasq + ansible.builtin.template: + src: dnsmasq.conf.j2 + dest: /etc/dnsmasq.d/cache.conf + owner: root + group: root + mode: u=rw,g=r,o=r + become: true + notify: Recharger dnsmasq.service + +- name: Déployer la configuration de l'instance + ansible.builtin.template: + owner: dnsmasq + group: root + mode: u=rw,g=r,o=r + src: host.conf.j2 + dest: /srv/dnsmasq/{{ inventory_hostname }}.conf + become: true + notify: Recharger dnsmasq.service diff --git a/tasks/installation.yml b/tasks/installation.yml new file mode 100644 index 0000000..9351365 --- /dev/null +++ b/tasks/installation.yml @@ -0,0 +1,16 @@ +--- +# tasks file for dnsmasq + +- name: Installer dnsmasq + become: true + ansible.builtin.package: + name: dnsmasq + +- name: Créer le dossier dédié à dnsmasq + ansible.builtin.file: + path: /srv/dnsmasq + state: directory + owner: dnsmasq + group: root + mode: u=rwX,g=rX,o=rX + become: true diff --git a/tasks/main.yml b/tasks/main.yml new file mode 100644 index 0000000..3080357 --- /dev/null +++ b/tasks/main.yml @@ -0,0 +1,10 @@ +--- +# tasks file for dnsmasq + +- name: Importer les tâches d'installation + tags: installation + ansible.builtin.import_tasks: installation.yml + +- name: Importer les tâches de configuration + tags: configuration + ansible.builtin.import_tasks: configuration.yml diff --git a/templates/dnsmasq.conf.j2 b/templates/dnsmasq.conf.j2 new file mode 100644 index 0000000..66c785d --- /dev/null +++ b/templates/dnsmasq.conf.j2 @@ -0,0 +1,40 @@ +# {{ ansible_managed }} + +# Ne pas transmettre les requêtes avec un nom court (pas FQDN) +domain-needed + +# Ne pas envoyer les requête sur les IP privées +bogus-priv + +# Spécifié le domaine pour qualifié les noms courts +domain={{ dnsmasq_conf_domain }} +local=/{{ dnsmasq_conf_domain }}/ + +# Ajoute le nom de domaine au noms simples +expand-hosts + +# Ne pas mettre en cache les requêtes n'aboutissant pas +no-negcache + +# Ne pas utiliser /etc/resolv.conf +no-resolv + +# Ne pas utiliser /etc/hosts +no-hosts + +# Utiliser dnscrypt-proxy +{% for server in dnsmasq_conf_servers %} +server={{ server }} +{% endfor %} + +# Bloquer le rebond DNS +stop-dns-rebind + +# Autoriser le rebond sur localhost +rebind-localhost-ok + +# Taille du cache DNS +cache-size=1024 + +# Définir le fichier des entrées personnalisées +addn-hosts=/srv/dnsmasq diff --git a/templates/host.conf.j2 b/templates/host.conf.j2 new file mode 100644 index 0000000..6dec476 --- /dev/null +++ b/templates/host.conf.j2 @@ -0,0 +1,8 @@ +# {{ ansible_managed }} + +{% for ip in dnsmasq_host_ipv4 %} +{{ ip }} {{ dnsmasq_client_hostname }} {{ dnsmasq_host_aliases | join(' ') }} +{% endfor %} +{% for ip in dnsmasq_host_ipv6 %} +{{ ip }} {{ dnsmasq_client_hostname }} {{ dnsmasq_host_aliases | join(' ') }} +{% endfor %}