Outils pour utilisateurs

Outils du site


anthony_messe:ansible:playbook

Ceci est une ancienne révision du document !


Utiliser les playbooks dans Ansible

On va utiliser un playbook pour exécuter toutes les tâches. C'est un fichier qui contient toutes les actions à effectuer (un peu comme un script shell).

Avec un seul fichier yml

Créez un fichier access_point.yml

nano access_point.yml

Placez-y le code ci-dessous (ce code déploie le projet avec une adresse IPv4 classe A)

---
- hosts: bpi
  vars:
     "wifi_driver": "nl80211"
     "wlan_interface": "wlx503eaa3d7d6c"
     ansible_connection: ssh 
     ansible_ssh_user: user 
     ansible_ssh_pass: bonjour
     ansible_become_method: su
     ansible_become_user: root
     ansible_become_pass: bonjour
     ansible_become: yes
  tasks:
  - name: Suppression du fichier sources.list
    file:
      path: /etc/apt/sources.list
      state: absent
  - name: Création du fichier sources.list
    copy:
      content: "# deb http://ftp.fr.debian.org/debian/ stretch main\n\ndeb http://ftp.fr.debian.org/debian/ stretch main contrib non-free\ndeb-src http://ftp.fr.debian.org/debian/ stretch main contrib non-free\n\ndeb http://security.debian.org/debian-security stretch/updates main contrib non-free\ndeb-src http://security.debian.org/debian-security stretch/updates main contrib non-free\n\n# stretch-updates, previously known as 'volatile'\ndeb http://ftp.fr.debian.org/debian/ stretch-updates main contrib non-free\ndeb-src http://ftp.fr.debian.org/debian/ stretch-updates main contrib non-free"
      dest: /etc/apt/sources.list
      force: no
  - name: Installation du paquet aptitude
    apt: pkg=aptitude state=installed update_cache=true
  - name: Mise à jour de la liste des paquets
    apt: update_cache=yes
  - name: Mise à jour des paquets
    apt: upgrade=yes
  - name: Installation du paquet wireless-tools
    apt: pkg=wireless-tools state=installed update_cache=true
  - name: Installation du paquet ntp
    apt: pkg=ntp state=installed update_cache=true
  - name: Installation du paquet ntp
    apt: pkg=ntp state=installed update_cache=true
  - name: Suppression du fichier de configuration /etc/ntp.conf
    file:
      path: /etc/ntp.conf
      state: absent
  - name: Création du fichier de configuration /etc/ntp.conf
    copy:
      content: "server ntp.ubuntu.com prefer\nserver ntp2.jussieu.fr\nserver 0.fr.pool.ntp.org\nserver 0.europe.pool.ntp.org"
      dest: /etc/ntp.conf
      force: no
  - name: Installation du paquet wpasupplicant
    apt: pkg=wpasupplicant state=installed update_cache=true
  - name: Installation du paquet dnsutils
    apt: pkg=dnsutils state=installed update_cache=true
  - name: Installation du paquet hostapd
    apt: pkg=hostapd state=installed update_cache=true
  - name: Suppression du fichier de configuration /etc/hostapd/hostapd.conf
    file:
      path: /etc/hostapd/hostapd.conf
      state: absent
  - name: Création du fichier de configuration /etc/hostapd/hostapd.conf
    copy:
      content: "interface={{ wlan_interface  }}\nssid=prxc\ndriver={{ wifi_driver }}\nchannel=6\nhw_mode=g\nwpa=2\nwpa_passphrase=mypassphrase\nwpa_key_mgmt=WPA-PSK\nwpa_pairwise=CCMP\nrsn_pairwise=CCMP"
      dest: /etc/hostapd/hostapd.conf
      force: no
  - name: Install Tor
    apt: pkg=tor state=installed update_cache=true
  - name: Suppression du fichier de configuration /etc/tor/torrc
    file:
      path: /etc/tor/torrc
      state: absent
  - name: Création du fichier de configuration /etc/tor/torrc
    copy:
      content: "VirtualAddrNetworkIPv4 10.192.0.0/10\nAutomapHostsOnResolve 1\nTransPort 9040\nDNSPort 5353\nTransListenAddress 10.255.255.254\nDNSListenAddress 10.255.255.254"
      dest: /etc/tor/torrc
      force: no
  - name: Suppression du fichier de configuration /etc/network/interfaces
    file:
      path: /etc/network/interfaces
      state: absent
  - name: Création du fichier de configuration /etc/network/interfaces
    copy:
      content: "source /etc/network/interfaces.d/*\n# The loopback network interface\nauto lo\niface lo inet loopback\n\n# The primary network interface\nallow-hotplug eth0\niface eth0 inet dhcp\n# This is an autoconfigured IPv6 interface\niface eth0 inet6 auto\n\nauto wlx503eaa3d7d6c\niface wlx503eaa3d7d6c inet static\nhostapd /etc/hostapd/hostapd.conf\naddress 10.255.255.254\nnetmask 255.0.0.0\n"
      dest: /etc/network/interfaces
      force: no
  - name: Installation du paquet dnsmasq
    apt: pkg=dnsmasq state=installed update_cache=true
  - name: Suppression du fichier de configuration /etc/dnsmasq.conf
    file:
      path: /etc/dnsmasq.conf
      state: absent
  - name: Création du fichier de configuration /etc/dnsmasq.conf
    copy:
       content: "interface={{ wlan_interface  }}\nno-dhcp-interface=lo, eth0\ndhcp-range=10.255.255.10,10.255.255.50,255.0.0.0,12h\nport = 0\ndhcp-option=6,10.255.255.254\n"
       dest: /etc/dnsmasq.conf
       force: no
  - name: Création du script iptables
    copy:
       content: "#!/bin/sh\n#Variables\n_trans_port=\"9040\"\n_dns_port=\"5353\"\n_interface_wifi=\"wlx503eaa3d7d6c\"\n_tor_uid=`id -u debian-tor`\n_router=\"10.255.255.254\" #Adresse du router(adresse de la machine ayant le point d'accès wifi)\n_reseau_wifi=\"10.0.0.0/8\"\n_unreachable=\"192.168.16.20/24\" #Adresse dont on empêche l'accès\n_eth0_ip=`ip -4 addr show eth0 | grep -oP \'(?<=inet\\s)\\d+(\\.\\d+){3}\'`\n\n#On efface toutes les règles iptables\niptables -F\niptables -X\niptables -t nat -F\niptables -t nat -X\niptables -t mangle -F\niptables -t mangle -X\n\n#On met les policy\niptables -P INPUT DROP\niptables -P FORWARD DROP\niptables -P OUTPUT DROP\nip6tables -P INPUT DROP\nip6tables -P FORWARD DROP\nip6tables -P OUTPUT DROP\n\n#On redirige le traffic TCP vers Tor\niptables -t nat -A PREROUTING -i $_interface_wifi -p tcp --syn -j REDIRECT --to-ports $_trans_port\n#On redirige les requêtes DNS vers Tor\niptables -t nat -A PREROUTING -i $_interface_wifi -p udp --dport 53 -j REDIRECT --to-ports $_dns_port\n\n#On log le trafic entrant\niptables -A INPUT -i $_interface_wifi -m state --state NEW -j LOG --log-prefix \"New input connection: \"\n#On autorise les requêtes DHCP à entrer\niptables -A INPUT -i $_interface_wifi -p udp --dport 67:68 --sport 67:68 -j ACCEPT\n#On autorise les connexion SSH\niptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -j ACCEPT\n#On autorise les connexions déja établies\niptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT\n#On autorise la boucle locale\niptables -A INPUT -i lo -j ACCEPT\n#On autorise les requêtes vers le routeur et le port DNS\niptables -A INPUT -d $_router -i $_interface_wifi -p udp -m udp --dport $_dns_port -j ACCEPT\n#On autorise les requêtes vers le routeur pour le traffic TCP\niptables -A INPUT -d $_router -i $_interface_wifi -p tcp -m tcp --dport $_trans_port --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT\n\n#On log le trafic sortant\niptables -I OUTPUT -m owner --uid-owner $_tor_uid -j LOG --log-prefix \"New output connection: \"\n#On drop le paquet si il n est pas dans l état new, established, ou related\niptables -A OUTPUT -m state --state INVALID -j DROP\n#On autorise ls connexions déja établies\niptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT\n#On autorise les requêtes DHCP à sortir\niptables -A OUTPUT -o $_interface_wifi -p udp --dport 67:68 --sport 67:68 -j ACCEPT\n#On autorise le traffic issu de la carte\niptables -A OUTPUT ! -s $_reseau_wifi -m owner --uid-owner 0 -j ACCEPT"
       dest: /root/iptables.sh
       force: no
       group: sys
       owner: root
       mode: 0777
  - name: Création du fichier service iptables
    copy:
       content: "[Unit]\nDescription=Setup firewall\nAfter=network.target local-fs.target\n[Service]\nRemainAfterExit=true\nExecStart=/root/iptables.sh\n[Install]\nWantedBy=multi-user.target"
       dest: /etc/systemd/system/iptables.service
       force: no
  - name: Activation du service iptables
    systemd:
       name: iptables
       enabled: yes
       masked: no
  - name: Activation du forwarding IPv4
    lineinfile:
      dest: /etc/sysctl.conf
      regexp: '^#\s*net.ipv4.ip_forward=1.*$'
      line: 'net.ipv4.ip_forward=1'
      backrefs: yes
  - name: Redémarrage des hosts
    become: yes
    shell: sleep 2 && /sbin/shutdown -r now "Ansible system package upgraded"
    async: 1
    poll: 0

On exécute ensuite le fichier avec la commande suivante

ansible-playbook access_point.yml

Avec des roles

Chaque rôle peut être exécuté en l'appelant. Il contient une suite d'instructions, un peu comme une fonction d'un programme.

On crée l'arborescence suivante

Le fichier ansible.retry est créé automatiquement et ne doit donc pas être créé par vous.
.
├── access_point.retry
├── access_point.yml
└── roles
    ├── configure_interfaces
    │   ├── files
    │   ├── handlers
    │   ├── meta
    │   ├── tasks
    │   ├── templates
    │   └── vars
    ├── dnsmasq
    │   ├── files
    │   ├── handlers
    │   ├── meta
    │   ├── tasks
    │   ├── templates
    │   └── vars
    Etc

Le dossier roles contient les dossiers suivants :

  • configure_interfaces
  • hostapd
  • ipv4_forwarding
  • tor
  • wifi_tools
  • dnsmasq
  • iptables
  • reboot
  • update_upgrade
  • ntp

Qui contiennent eux-mêmes les dossiers suivants :

  • files
  • handlers
  • meta
  • tasks
  • templates
  • vars

Nous n'utilisons que le dossier tasks, la création des autres dossiers est donc facultative.

access_point.yml

À la racine, le fichier access_point.yml contient le code suivant

---
- hosts: bpi
  vars:
     "wifi_driver": "nl80211"
     "wlan_interface": "wlx503eaa3d7d6c"
     ansible_connection: ssh
     ansible_ssh_user: user
     ansible_ssh_pass: bonjour
     ansible_become_method: su
     ansible_become_user: root
     ansible_become_pass: bonjour
     ansible_become: yes
  roles:
  - role: update_upgrade
  - role: wifi_tools
  - role: hostapd
  - role: tor
  - role: ntp
  - role: configure_interfaces
  - role: dnsmasq
  - role: iptables
  - role: ipv4_forwarding
  - role: reboot

Contenu des dossiers

On va maintenant créer un fichier main.yml dans le dossier tasks de chacun des dossiers créés dans rôle. C'est à dire :

  • configure_interfaces
  • hostapd
  • ipv4_forwarding
  • tor
  • wifi_tools
  • dnsmasq
  • iptables
  • reboot
  • update_upgrade

Comme ceci :

└── roles
    ├── configure_interfaces
    │   ├── files
    │   ├── handlers
    │   ├── meta
    │   ├── tasks
    │   │   └── main.yml
    │   ├── templates
    │   └── vars

Voici le contenu de chaque fichier main.yml de chaque dossier

On reprend simplement le code du playbook du début

configure_interfaces

---
- name: Suppression du fichier de configuration /etc/network/interfaces
  file:
    path: /etc/network/interfaces
    state: absent
- name: Création du fichier de configuration /etc/network/interfaces
  copy:
    content: "source /etc/network/interfaces.d/*\n# The loopback network interface\nauto lo\niface lo inet loopback\n\n# The primary network interface\nallow-hotplug eth0\niface eth0 inet dhcp\n# This is an autoconfigured IPv6 interface\niface eth0 inet6 auto\n\nauto wlx503eaa3d7d6c\niface wlx503eaa3d7d6c inet static\nhostapd /etc/hostapd/hostapd.conf\naddress 10.255.255.254\nnetmask 255.0.0.0\n"
    dest: /etc/network/interfaces
    force: no

hostapd

---
- name: Installation du paquet hostapd
  apt: pkg=hostapd state=installed update_cache=true
- name: Suppression du fichier de configuration /etc/hostapd/hostapd.conf
  file:
    path: /etc/hostapd/hostapd.conf
    state: absent
- name: Création du fichier de configuration /etc/hostapd/hostapd.conf
  copy:
    content: "interface={{ wlan_interface  }}\nssid=prxc\ndriver={{ wifi_driver }}\nchannel=6\nhw_mode=g\nwpa=2\nwpa_passphrase=mypassphrase\nwpa_key_mgmt=WPA-PSK\nwpa_pairwise=CCMP\nrsn_pairwise=CCMP"
    dest: /etc/hostapd/hostapd.conf
    force: no

Pour logger, on peut ajouter les options suivantes au fichier hostapd.conf:

logger_syslog=-1
logger_syslog_level=1
logger_stdout=-1
logger_stdout_level=2

ipv4_forwarding

---
- name: Activation du forwarding IPv4
  lineinfile:
    dest: /etc/sysctl.conf
    regexp: '^#\s*net.ipv4.ip_forward=1.*$'
    line: 'net.ipv4.ip_forward=1'
    backrefs: yes

tor

---
- name: Install Tor
  apt: pkg=tor state=installed update_cache=true
- name: Suppression du fichier de configuration /etc/tor/torrc
  file:
    path: /etc/tor/torrc
    state: absent
- name: Création du fichier de configuration /etc/tor/torrc
  copy:
    content: "VirtualAddrNetworkIPv4 10.192.0.0/10\nAutomapHostsOnResolve 1\nTransPort 9040\nDNSPort 5353\nTransListenAddress 10.255.255.254\nDNSListenAddress 10.255.255.254"
    dest: /etc/tor/torrc
    force: no

wifi_tools

---
- name: Installation du paquet wireless-tools
  apt: pkg=wireless-tools state=installed update_cache=true
- name: Installation du paquet wpasupplicant
  apt: pkg=wpasupplicant state=installed update_cache=true
- name: Installation du paquet dnsutils
  apt: pkg=dnsutils state=installed update_cache=true

dnsmasq

---
- name: Installation du paquet dnsmasq
  apt: pkg=dnsmasq state=installed update_cache=true
- name: Suppression du fichier de configuration /etc/dnsmasq.conf
  file:
    path: /etc/dnsmasq.conf
    state: absent
- name: Création du fichier de configuration /etc/dnsmasq.conf
  copy:
     content: "interface={{ wlan_interface  }}\nno-dhcp-interface=lo, eth0\ndhcp-range=10.255.255.10,10.255.255.50,255.0.0.0,12h\nport = 0\ndhcp-option=6,10.255.255.254\n"
     dest: /etc/dnsmasq.conf
     force: no

iptables

---
- name: Création du script iptables
  copy:
     content: "#!/bin/sh\n#Variables\n_trans_port=\"9040\"\n_dns_port=\"5353\"\n_interface_wifi=\"wlx503eaa3d7d6c\"\n_tor_uid=`id -u debian-tor`\n_router=\"10.255.255.254\" #Adresse du router(adresse de la machine ayant le point d'accès wifi)\n_reseau_wifi=\"10.0.0.0/8\"\n_unreachable=\"192.168.16.20/24\" #Adresse dont on empêche l'accès\n_eth0_ip=`ip -4 addr show eth0 | grep -oP \'(?<=inet\\s)\\d+(\\.\\d+){3}\'`\n\n#On efface toutes les règles iptables\niptables -F\niptables -X\niptables -t nat -F\niptables -t nat -X\niptables -t mangle -F\niptables -t mangle -X\n\n#On met les policy\niptables -P INPUT DROP\niptables -P FORWARD DROP\niptables -P OUTPUT DROP\nip6tables -P INPUT DROP\nip6tables -P FORWARD DROP\nip6tables -P OUTPUT DROP\n\n#On redirige le traffic TCP vers Tor\niptables -t nat -A PREROUTING -i $_interface_wifi -p tcp --syn -j REDIRECT --to-ports $_trans_port\n#On redirige les requêtes DNS vers Tor\niptables -t nat -A PREROUTING -i $_interface_wifi -p udp --dport 53 -j REDIRECT --to-ports $_dns_port\n\n#On log le trafic entrant\niptables -A INPUT -i $_interface_wifi -m state --state NEW -j LOG --log-prefix \"New input connection: \"\n#On autorise les requêtes DHCP à entrer\niptables -A INPUT -i $_interface_wifi -p udp --dport 67:68 --sport 67:68 -j ACCEPT\n#On autorise les connexion SSH\niptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -j ACCEPT\n#On autorise les connexions déja établies\niptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT\n#On autorise la boucle locale\niptables -A INPUT -i lo -j ACCEPT\n#On autorise les requêtes vers le routeur et le port DNS\niptables -A INPUT -d $_router -i $_interface_wifi -p udp -m udp --dport $_dns_port -j ACCEPT\n#On autorise les requêtes vers le routeur pour le traffic TCP\niptables -A INPUT -d $_router -i $_interface_wifi -p tcp -m tcp --dport $_trans_port --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT\n\n#On log le trafic sortant\niptables -I OUTPUT -m owner --uid-owner $_tor_uid -j LOG --log-prefix \"New output connection: \"\n#On drop le paquet si il n est pas dans l état new, established, ou related\niptables -A OUTPUT -m state --state INVALID -j DROP\n#On autorise ls connexions déja établies\niptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT\n#On autorise les requêtes DHCP à sortir\niptables -A OUTPUT -o $_interface_wifi -p udp --dport 67:68 --sport 67:68 -j ACCEPT\n#On autorise le traffic issu de la carte\niptables -A OUTPUT ! -s $_reseau_wifi -m owner --uid-owner 0 -j ACCEPT"
     dest: /root/iptables.sh
     force: no
     group: sys
     owner: root
     mode: 0777
- name: Création du fichier service iptables
  copy:
     content: "[Unit]\nDescription=Setup firewall\nAfter=network.target local-fs.target\n[Service]\nRemainAfterExit=true\nExecStart=/root/iptables.sh\n[Install]\nWantedBy=multi-user.target"
     dest: /etc/systemd/system/iptables.service
     force: no
- name: Activation du service iptables
  systemd:
     name: iptables
     enabled: yes
     masked: no

reboot

---
- name: Redémarrage des hosts
  become: yes
  shell: sleep 2 && /sbin/shutdown -r now "Ansible system package upgraded"
  async: 1
  poll: 0

ntp

---
- name: Installation du paquet ntp
  apt: pkg=ntp state=installed update_cache=true
- name: Suppression du fichier de configuration /etc/ntp.conf
  file:
    path: /etc/ntp.conf
    state: absent
- name: Création du fichier de configuration /etc/ntp.conf
  copy:
     content: "server ntp.ubuntu.com prefer\nserver ntp2.jussieu.fr\nserver 0.fr.pool.ntp.org\nserver 0.europe.pool.ntp.org"
     dest: /etc/ntp.conf
     force: no

update_upgrade

---
- name: Suppression du fichier sources.list
  file:
    path: /etc/apt/sources.list
    state: absent
- name: Création du fichier sources.list
  copy:
    content: "# deb http://ftp.fr.debian.org/debian/ stretch main\n\ndeb http://ftp.fr.debian.org/debian/ stretch main contrib non-free\ndeb-src http://ftp.fr.debian.org/debian/ stretch main contrib non-free\n\ndeb http://security.debian.org/debian-security stretch/updates main contrib non-free\ndeb-src http://security.debian.org/debian-security stretch/updates main contrib non-free\n\n# stretch-updates, previously known as 'volatile'\ndeb http://ftp.fr.debian.org/debian/ stretch-updates main contrib non-free\ndeb-src http://ftp.fr.debian.org/debian/ stretch-updates main contrib non-free"
    dest: /etc/apt/sources.list
    force: no
- name: Installation du paquet aptitude
  apt: pkg=aptitude state=installed update_cache=true
- name: Mise à jour de la liste des paquets
  apt: update_cache=yes
- name: Mise à jour des paquets
  apt: upgrade=yes

Puis comme précédemment, on exécute le fichier ansible

ansible-playbook access_point.yml

Ressources

anthony_messe/ansible/playbook.1525699522.txt.gz · Dernière modification: 2018/05/07 15:25 par Anthony Messé