Skip to content
Snippets Groups Projects
Commit 5700d29c authored by nikola.antonije's avatar nikola.antonije
Browse files

hello

parent a965d4c4
No related branches found
No related tags found
No related merge requests found
img/1.png 0 → 100644
img/1.png

90.5 KiB

img/2.png 0 → 100644
img/2.png

71.9 KiB

img/3.png 0 → 100644
img/3.png

80.7 KiB

img/4.png 0 → 100644
img/4.png

93.2 KiB

img/5.png 0 → 100644
img/5.png

124 KiB

[hosts]
H1
H2
[routers]
R1
R2
\ No newline at end of file
# Labo 3
Lien du repository git : https://gitedu.hesge.ch/nikola.antonije/labo-3-ansible
## Partie 1 - Topologie
`ansible -m ping -i "H1,H2,R1,R2" all` permet d'effectuer une commande ping sur les hôtes H1, H2, R1 et R2 grâce au module ping de Ansible. L'argument -m ping précise le module à utiliser. L'argument -i précise l'inventaire à utiliser, ce qui est dans notre cas, la liste des hôtes que nous souhaitons ping. Pour finir, all précise que nous voulu effectuer cette commande sur tous les hôtes.
<img src="./img/1.png" width="350">
La commande ad-hoc permettant d'afficher l'uptime de toutes les machines est `ansible all -m command -a "uptime"`
<img src="./img/2.png" width="350">
La commande permettant de créer le fichier `hello.txt` dans le dossier `tmp` est :
`ansible all -m file -a "path=/tmp/hello.txt state=touch" -i "H1,H2,R1,R2"`
<img src="./img/3.png" width="350">
Les trois sont des modules d'Ansible. Ils sont utilisé pour executer des commandes sur des hôtes distants mais ne sont pas similaire dans l'execution des commandes.
- `command` exécute une commande sans interprétation du shell. Ce qui signifie que la commande peut être executée sur l'hôte distant, sans passer par le shell. Ce qui signifie que certaines fonctionnalités de shell ne fonctionnent par exemple les pipes. `ansible all -m command -a "ls /tmp"`
- `shell` exécute une commande via un shell par défaut sur l'hôte distant. Contrairement à `command`, elle permet d'utiliser toutes les fonctionnalités du shell. `ansible all -m shell -a "grep -i error /var/log/messages"`
- `raw` exécute une commande sans l'interprétation du shell comme le module `command`, mais ne requiert pas Python soit installé sur l'hôte distant. La commande est executée directement en SSH. `ansible all -m raw -a "yum install -y https"`
## Partie 2 - Routage et adressage
Le fichier `playbook.yml` commence par la définition de la tâche principale nommée "Configuration et démarrage des interfaces réseau". Cette tâche est appliquée à tous les hôtes dans l'inventaire (hosts: all) et les tâches sont exécutées avec les privilèges de super-utilisateur grâce a la commande become: true.
La tâche principale est composée de plusieurs sous-tâches. Tout d'abord, la tâche "Load the variables" est exécutée pour charger les variables à partir du fichier "variables.yml". Ensuite, la tâche "Rename hosts" est exécutée pour renommer les hôtes avec leur nom d'inventaire.
Ensuite, deux tâches sont utilisées pour configurer les interfaces réseau des hôtes. La première tâche nommée "Setup network for Hosts" configure les interfaces réseau pour les hôtes "H1" et "H2" uniquement. Cette tâche utilise le module "template" pour générer un fichier de configuration d'interface réseau à partir du modèle stocké dans le fichier "host.j2". Le fichier de configuration généré est enregistré dans "/etc/network/interfaces.d/eth.conf". Une fois la configuration terminée, la tâche "Restart network" est déclenchée pour redémarrer le service réseau.
La deuxième tâche nommée "Setup network for Routers" configure les interfaces réseau pour les hôtes qui appartiennent au groupe "routers". Cette tâche utilise également le module "template" pour générer un fichier de configuration d'interface réseau à partir du modèle stocké dans le fichier "router.j2". Le fichier de configuration généré est enregistré dans "/etc/network/interfaces.d/eth.conf". Une fois la configuration terminée, la tâche "Restart network" est déclenchée pour redémarrer le service réseau.
Enfin, une section "handlers" est définie pour gérer la tâche de redémarrage du service réseau. Elle contient une seule tâche nommée "Restart network", qui utilise le module "service" pour redémarrer le service réseau et le configurer pour qu'il soit activé au démarrage.
Le reste du fichier YAML définit une deuxième tâche nommée "Display ping value". Cette tâche est appliquée uniquement à l'hôte "H1". Elle exécute une tâche nommée "Ping form H1 to H2" qui utilise le module "shell" pour lancer une commande "ping" vers l'adresse IP "3.0.0.3" avec une limite de 1 paquet. Le résultat de cette tâche est enregistré dans une variable nommée "result". La tâche suivante nommée "Print result" utilise le module "debug" pour afficher les lignes de sortie de la commande ping stockées dans la variable "result.stdout_lines".
Les options --syntax-check et --check sont deux options utiles dans la commande ansible-playbook pour vérifier la syntaxe et tester la configuration des tâches avant l'exécution d'un playbook. L'option --syntax-check vérifie la validité de la syntaxe YAML de tous les fichiers de tâches inclus dans le playbook, en signalant les erreurs de syntaxe et les avertissements potentiels. L'option --check, quant à elle, simule l'exécution des tâches sans les appliquer, ce qui permet de détecter les erreurs potentielles sans les corriger. Cette option peut être utilisée pour vérifier la configuration actuelle de l'infrastructure cible et identifier les changements qui seront appliqués lors de l'exécution réelle du playbook. En combinant ces deux options, les administrateurs système peuvent s'assurer que leurs playbooks Ansible sont correctement configurés et prêts à être exécutés avant de les appliquer à l'infrastructure en production.
<img src="./img/4.png" width="1000">
# Partie 3 - Tunnel wireguard et serveur web
La première section du playbook, nommée "Rename all hosts", est responsable du changement du nom d'hôte de toutes les machines en utilisant la commande shell "hostnamectl set-hostname". Pour obtenir le nom d'hôte actuel de chaque machine, Ansible utilise la variable "inventory_hostname".
Ensuite, la section "Setup network for Hosts" configure le réseau pour les machines de type "hosts". Cette section utilise le module "template" pour générer un fichier de configuration réseau basé sur un modèle "host.j2", et le place dans le répertoire "/etc/network/interfaces.d". Lorsque le fichier est modifié, Ansible exécute une tâche "notify" pour redémarrer le service "networking".
La section "Setup network for Routers" configure le réseau pour les machines de type "routers". Cette section utilise également le module "template" pour générer un fichier de configuration réseau basé sur un modèle "router.j2". En plus de cela, cette section utilise la commande shell "sysctl" pour activer le routage IP sur les machines de type "routers".
La section suivante, "Install all needed program", installe plusieurs paquets logiciels sur toutes les machines. Cette section utilise le module "apt" pour installer les paquets "nginx", "wireguard", "wireguard-tools", et "curl".
Enfin, les deux dernières sections "Setup index.html on H2" et "Setup wireguard on H1" sont spécifiques à certaines machines. La première section, "Setup index.html on H2", génère une page HTML de base pour un serveur Web Nginx, et configure un serveur VPN WireGuard sur la machine H2. La seconde section, "Setup wireguard on H1", configure un autre serveur VPN WireGuard sur la machine H1 et effectue un test de connectivité à l'aide de la commande "curl". Le résultat est stocké dans une variable et affiché à l'aide de la commande "debug".
<img src="./img/5.png" width="1000">
main.py 0 → 100644
#!/usr/bin/env python3
import jinja2
import requests
from jinja2 import Environment, FileSystemLoader
import json
import sys
PROJECTS_URL = "https://gns3.hepiapp.ch/v2/projects"
PROJECTS_NODES_URL = PROJECTS_URL+'/f2fbe36f-f528-4b48-9b44-b33384e20e64/nodes'
def read_ips():
r = requests.get('https://gns3.hepiapp.ch/v2/projects/1c30aca8-b16b-427b-aa9e-382911175f0c/nodes')
env = jinja2.Environment(loader=FileSystemLoader(searchpath='templates'))
template = env.get_template('example.txt')
final = ''
for node in r.json():
if node['console'] is not None:
contenu = template.render(
name=node['label']['text'],
ip=node['console_host'],
port=node['console'] + 1
)
final += contenu + '\n \n'
with open('/home/niko/.ssh/config.d/hostnames', "w") as f:
f.write(final)
if __name__ == "__main__":
read_ips()
\ No newline at end of file
---
- name: Configuration et démarrage des interfaces réseau
hosts: all
become: true
tasks:
- name: Load the variables
include_vars: variables.yml
- name: Rename hosts
hostname:
name: "{{ inventory_hostname }}"
# For H1 and H2, we config network interfaces
- name: Setup network for Hosts
become: true
when: "'H1' in inventory_hostname or 'H2' in inventory_hostname"
template:
src: ./templates/host.j2
dest: /etc/network/interfaces.d/eth.conf
mode: 0640
notify: Restart network
- name: Setup network for Routers
when: "'routers' in group_names"
become: true
template:
src: ./templates/router.j2
dest: /etc/network/interfaces.d/eth.conf
mode: 0640
notify: Restart network
handlers:
- name: Restart network
service:
name: networking
state: restarted
enabled: true
# Test en effectuant un ping de H1 à H2
- name: Display ping value
hosts: H1
become: true
tasks:
- name: Ping form H1 to H2
shell: "ping 3.0.0.3 -c 1"
register: result
- name: Print result
debug:
msg: "{{ result.stdout_lines }}"
...
\ No newline at end of file
Host {{ name }}
User root
Hostname {{ ip }}
Port {{ port }}
StrictHostKeychecking no
UserKnownHostsFile /dev/null
IdentityFile /home/niko/.ssh/gns3.rsa
\ No newline at end of file
auto {{ all[inventory_hostname].ifname }}
iface {{ all[inventory_hostname].ifname }} inet static
address {{ all[inventory_hostname].ifip }}
netmask {{ all[inventory_hostname].ifmask }}
post-up ip route add default via {{ all[inventory_hostname].ifgw }}
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>Labo 3</title>
</head>
<body>
<h1>Laboratoire 3</h1>
<p>Ceci est une page de test.</p>
</body>
</html>
\ No newline at end of file
auto {{ interface }}
iface {{ interface }} inet static
address {{ address }}
netmask {{ netmask }}
# Configuration de Nginx
events {
worker_connections 1024;
}
http {
server {
listen 10.0.0.1:80;
server_name labo3.com;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
}
auto {{ all[inventory_hostname].ifname }}
iface {{ all[inventory_hostname].ifname }} inet static
address {{ all[inventory_hostname].ifip }}
netmask {{ all[inventory_hostname].ifmask }}
auto {{ all[inventory_hostname].ifname2 }}
iface {{ all[inventory_hostname].ifname2 }} inet static
address {{ all[inventory_hostname].ifip2 }}
netmask {{ all[inventory_hostname].ifmask2 }}
{% if inventory_hostname != "R2" %}
post-up ip route add 3.0.0.0/24 via {{ all[inventory_hostname].ifgw }}
{% endif %}
{% if inventory_hostname != "R1" %}
post-up ip route add 1.0.0.0/24 via {{ all[inventory_hostname].ifgw }}
{% endif %}
[Interface]
Address = 10.0.0.2/24
ListenPort = 51820
PrivateKey = 2N3bxgrRL7iAdEQqu6m+XiZjggyBWxAmyN1EIiZPoGE=
[Peer]
PublicKey = q/UnTfoiUQcpNl5/2alk4LMxQ0REDU2PuA5i9AgA40Y=
Endpoint = 3.0.0.2:51820
AllowedIPs = 10.0.0.0/24
\ No newline at end of file
[Interface]
Address = 10.0.0.1/24
PrivateKey = eDyueQ5kGmN/r/sMuDkvnybz/VFv6UoLicrrR3+JFEQ=
ListenPort = 51820
[Peer]
PublicKey = 4pfWe7Hu7iwkF1lyLj3+7xJbqemPStyfGPWI8lksEng=
AllowedIPs = 10.0.0.0/24
all:
R1:
ifname: "eth1"
ifip: "1.0.0.1"
ifmask: "255.255.255.0"
ifname2: "eth0"
ifip2: "2.0.0.1"
ifmask2: "255.255.255.0"
ifgw: "2.0.0.2"
R2:
ifname: "eth0"
ifip: "2.0.0.2"
ifmask: "255.255.255.0"
ifname2: "eth1"
ifip2: "3.0.0.2"
ifmask2: "255.255.255.0"
ifgw: "2.0.0.1"
H1:
ifname: "eth0"
ifip: "1.0.0.3"
ifmask: "255.255.255.0"
ifgw: "1.0.0.1"
iftarget: "3.0.0.0/24"
ifprivate: "2N3bxgrRL7iAdEQqu6m+XiZjggyBWxAmyN1EIiZPoGE="
ifpublic: "q/UnTfoiUQcpNl5/2alk4LMxQ0REDU2PuA5i9AgA40Y="
H2:
ifname: "eth0"
ifip: "3.0.0.3"
ifmask: "255.255.255.0"
ifgw: "3.0.0.2"
iftarget: "1.0.0.0/24"
title: "Labo3"
wgport: 51820
ifprivate: "eDyueQ5kGmN/r/sMuDkvnybz/VFv6UoLicrrR3+JFEQ="
ifpublic: "4pfWe7Hu7iwkF1lyLj3+7xJbqemPStyfGPWI8lksEng="
\ No newline at end of file
- name: Rename all hosts
hosts: all
become: true
tasks:
- name: Load the variables
include_vars: variables.yml
- name: Rename hosts
shell: "hostnamectl set-hostname {{ inventory_hostname }}"
- name: Setup network for Hosts
hosts: hosts
become: yes
tasks:
- name: "Create file interface in interfaces.d for hosts"
template:
src: ./templates/host.j2
dest: /etc/network/interfaces.d/interfaces_playbook.conf
mode: 0640
notify: Restart network
handlers:
- name: Restart network
service:
name: networking
state: restarted
enabled: yes
- name: Setup network for Routers
hosts: routers
become: yes
tasks:
- name: "Create file interface in interfaces.d for routers"
template:
src: ./templates/router.j2
dest: /etc/network/interfaces.d/interfaces_playbook.conf
mode: 0640
notify: Restart network
- name: "Set ip_forwarding to 1"
shell: "sysctl net.ipv4.ip_forward=1"
handlers:
- name: Restart network
service:
name: networking
state: restarted
enabled: yes
- name: Install all needed program
hosts: hosts
become: true
tasks:
#- name: Give internet to host
# shell: "ip route add default via 10.0.2.2"
- name: Install update for install other programs
apt:
cache_valid_time: 86400
upgrade: yes
update_cache: yes
- name: Install nginx
apt:
pkg:
- nginx
- wireguard
- wireguard-tools
- curl
state: present
- name: Setup index.html on H2
hosts: H2
become: true
tasks:
- name: Setup VPN Wireguard H2
template:
src: ./templates/wg_h2.j2
dest: /etc/wireguard/wg0.conf
mode: 0640
notify: wg-quick
- name: Setup page of nginx
template:
src: ./templates/index.j2
dest: /var/www/html/index.html
mode: 0777
- name: Setup config of nginx
template:
src: ./templates/nginx.j2
dest: /etc/nginx/sites-available/default
mode: 0640
notify: Restart nginx
handlers:
- name: wg-quick
shell:
cmd: "wg-quick up wg0 2>/dev/null"
handlers:
- name: Restart nginx
service:
name: nginx
state: restarted
enabled: yes
- name: Setup wireguard on H1
hosts: H1
become: true
tasks:
- name: Setup VPN Wireguard H1
copy:
src: ./templates/wg_h1.j2
dest: /etc/wireguard/wg0.conf
mode: 0640
- name: Start WireGuard tunnel on H1
shell:
cmd: "wg-quick up wg0 2>/dev/null"
- name: Check connectivity using curl
shell: "curl 10.0.0.2"
register: result
ignore_errors: true
- name: Print result
debug:
msg: "{{ result.stdout_lines }}"
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment