add stirling pdf deployment
This commit is contained in:
242
playbooks/create-lxc.yml
Normal file
242
playbooks/create-lxc.yml
Normal file
@@ -0,0 +1,242 @@
|
||||
---
|
||||
# Playbook: create-docker.yml
|
||||
#
|
||||
# But:
|
||||
# - Creer un conteneur LXC Proxmox pret pour Docker
|
||||
# - Activer les options necessaires pour Docker dans LXC
|
||||
# - Installer les paquets de base
|
||||
# - Creer un utilisateur ansible
|
||||
# - Ajouter la cle SSH de ansible-srv
|
||||
# - Ajouter automatiquement le nouveau LXC dans inventory/hosts.ini
|
||||
#
|
||||
# Exemple:
|
||||
# ansible-playbook -i inventory/hosts.ini playbooks/create-docker-lxc.yml \
|
||||
# -e target_node=pve02 \
|
||||
# -e lxc_ctid=102 \
|
||||
# -e lxc_hostname=tracearr \
|
||||
# -e lxc_ip=10.100.5.102/24 \
|
||||
# -e lxc_gateway=10.100.5.1 \
|
||||
# -e lxc_memory=2048 \
|
||||
# -e lxc_swap=1024 \
|
||||
# -e lxc_disk=20 \
|
||||
# -e lxc_inventory_group=tracearr_servers
|
||||
|
||||
- name: Creer un LXC pret
|
||||
hosts: "{{ target_node }}"
|
||||
become: false
|
||||
gather_facts: false
|
||||
|
||||
vars:
|
||||
# Identite du conteneur LXC
|
||||
lxc_ctid: 105
|
||||
lxc_hostname: passwordpusher
|
||||
|
||||
# Configuration reseau du conteneur
|
||||
lxc_ip: 10.100.5.104/24
|
||||
lxc_gateway: 10.100.5.1
|
||||
lxc_bridge: vmbr0
|
||||
|
||||
# Stockages Proxmox
|
||||
# lxc_storage: stockage ou sera cree le disque du conteneur
|
||||
# lxc_template_storage: stockage ou se trouve le template LXC
|
||||
lxc_storage: proxmox-data-nfs
|
||||
lxc_template_storage: proxmox-data-nfs
|
||||
|
||||
# Template Debian utilise pour creer le conteneur
|
||||
lxc_template: debian-13-standard_13.1-2_amd64.tar.zst
|
||||
|
||||
# Ressources du conteneur
|
||||
lxc_cores: 2
|
||||
lxc_memory: 2048
|
||||
lxc_swap: 1024
|
||||
lxc_disk: 15
|
||||
|
||||
# IP du serveur Ansible
|
||||
# Cette IP sera utilisee dans authorized_keys pour limiter la cle SSH
|
||||
ansible_controller_ip: 10.100.5.100
|
||||
|
||||
# Fichier inventaire a mettre a jour automatiquement
|
||||
lxc_inventory_file: "{{ playbook_dir }}/../inventory/hosts.ini"
|
||||
|
||||
# Groupe Ansible ajoute dans inventory/hosts.ini
|
||||
# Exemple:
|
||||
# lxc_hostname=tracearr -> passwordpusher_servers
|
||||
lxc_inventory_group: "{{ lxc_hostname | replace('-', '_') }}_servers"
|
||||
|
||||
# Parametres Ansible du futur conteneur
|
||||
lxc_ansible_user: ansible
|
||||
lxc_ansible_python_interpreter: /usr/bin/python3
|
||||
|
||||
# IP sans le /24
|
||||
# Exemple: 10.100.5.102/24 -> 10.100.5.102
|
||||
lxc_ip_address: "{{ lxc_ip.split('/')[0] }}"
|
||||
|
||||
tasks:
|
||||
# On verifie que le CTID n'existe pas deja.
|
||||
# Le playbook s'arrete si le conteneur existe deja pour eviter
|
||||
# d'ecraser un service existant.
|
||||
- name: Verifier si le CT existe deja
|
||||
command: pct status {{ lxc_ctid }}
|
||||
register: ct_status
|
||||
changed_when: false
|
||||
failed_when: false
|
||||
|
||||
- name: Arreter si le CT existe deja
|
||||
fail:
|
||||
msg: "CT {{ lxc_ctid }} already exists on this node. Stop to avoid overwrite."
|
||||
when: ct_status.rc == 0
|
||||
|
||||
# On copie la cle publique de ansible-srv sur le noeud Proxmox.
|
||||
# Elle sera injectee dans le compte root du LXC au moment du pct create.
|
||||
- name: Copier la cle publique Ansible sur le noeud Proxmox
|
||||
copy:
|
||||
content: "{{ lookup('file', '/root/.ssh/id_ed25519.pub') }}"
|
||||
dest: /tmp/ansible-srv.pub
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0600"
|
||||
|
||||
# Creation du conteneur LXC.
|
||||
#
|
||||
# --unprivileged 1:
|
||||
# conteneur non privilegie, plus securise
|
||||
#
|
||||
# --features nesting=1,keyctl=1:
|
||||
# options necessaires pour faire tourner Docker dans un LXC
|
||||
#
|
||||
# --ssh-public-keys:
|
||||
# ajoute la cle SSH dans le LXC lors de la creation
|
||||
#
|
||||
# --start 1:
|
||||
# demarre le conteneur directement apres creation
|
||||
- name: Creer le conteneur LXC
|
||||
command: >
|
||||
pct create {{ lxc_ctid }}
|
||||
{{ lxc_template_storage }}:vztmpl/{{ lxc_template }}
|
||||
--hostname {{ lxc_hostname }}
|
||||
--cores {{ lxc_cores }}
|
||||
--memory {{ lxc_memory }}
|
||||
--swap {{ lxc_swap }}
|
||||
--rootfs {{ lxc_storage }}:{{ lxc_disk }}
|
||||
--net0 name=eth0,bridge={{ lxc_bridge }},ip={{ lxc_ip }},gw={{ lxc_gateway }}
|
||||
--ostype debian
|
||||
--unprivileged 1
|
||||
--features nesting=1,keyctl=1
|
||||
--ssh-public-keys /tmp/ansible-srv.pub
|
||||
--start 1
|
||||
register: create_result
|
||||
|
||||
- name: Afficher le resultat de creation
|
||||
debug:
|
||||
var: create_result.stdout_lines
|
||||
|
||||
# Petite pause pour laisser le conteneur terminer son premier demarrage.
|
||||
- name: Attendre le premier demarrage
|
||||
pause:
|
||||
seconds: 10
|
||||
|
||||
# Mise a jour du cache APT dans le conteneur.
|
||||
- name: Mettre a jour le cache APT dans le CT
|
||||
command: pct exec {{ lxc_ctid }} -- apt update
|
||||
changed_when: false
|
||||
|
||||
# Installation des paquets minimums.
|
||||
#
|
||||
# openssh-server: acces SSH
|
||||
# sudo: elevation de privileges pour Ansible
|
||||
# python3: obligatoire pour les modules Ansible
|
||||
# curl/gnupg/ca-certificates: utiles pour installer Docker ensuite
|
||||
# nano: edition manuelle si besoin
|
||||
- name: Installer les paquets de base dans le CT
|
||||
command: >
|
||||
pct exec {{ lxc_ctid }} --
|
||||
apt install -y openssh-server sudo python3 curl ca-certificates gnupg nano
|
||||
changed_when: true
|
||||
|
||||
- name: Activer SSH dans le CT
|
||||
command: pct exec {{ lxc_ctid }} -- systemctl enable --now ssh
|
||||
changed_when: true
|
||||
|
||||
# Creation de l'utilisateur ansible.
|
||||
# Cet utilisateur sera utilise pour piloter le LXC via SSH.
|
||||
- name: Creer l utilisateur ansible dans le CT
|
||||
command: pct exec {{ lxc_ctid }} -- bash -c "id ansible || useradd -m -s /bin/bash ansible"
|
||||
changed_when: true
|
||||
|
||||
- name: Creer le dossier SSH de l utilisateur ansible
|
||||
command: pct exec {{ lxc_ctid }} -- mkdir -p /home/ansible/.ssh
|
||||
changed_when: true
|
||||
|
||||
# Ajout de la cle publique Ansible dans authorized_keys.
|
||||
#
|
||||
# from="10.100.5.100":
|
||||
# la cle SSH ne peut etre utilisee que depuis ansible-srv
|
||||
#
|
||||
# no-agent-forwarding / no-X11-forwarding / no-port-forwarding:
|
||||
# limite les usages possibles de cette cle
|
||||
- name: Ajouter la cle publique Ansible dans le CT
|
||||
command: >
|
||||
pct exec {{ lxc_ctid }} -- bash -c
|
||||
'echo "from=\"{{ ansible_controller_ip }}\",no-agent-forwarding,no-X11-forwarding,no-port-forwarding {{ lookup("file", "/root/.ssh/id_ed25519.pub") }}" > /home/ansible/.ssh/authorized_keys'
|
||||
changed_when: true
|
||||
|
||||
# Permissions SSH strictes.
|
||||
# Sans ces permissions, SSH peut refuser la cle.
|
||||
- name: Corriger les permissions SSH dans le CT
|
||||
command: >
|
||||
pct exec {{ lxc_ctid }} -- bash -c
|
||||
"chown -R ansible:ansible /home/ansible/.ssh &&
|
||||
chmod 700 /home/ansible/.ssh &&
|
||||
chmod 600 /home/ansible/.ssh/authorized_keys"
|
||||
changed_when: true
|
||||
|
||||
# Sudo sans mot de passe pour Ansible.
|
||||
# Necessaire pour que les playbooks puissent installer Docker,
|
||||
# copier des fichiers dans /opt/stacks et gerer les services.
|
||||
#
|
||||
# Plus tard, on pourra reduire ces droits.
|
||||
- name: Configurer sudo pour l utilisateur ansible
|
||||
command: >
|
||||
pct exec {{ lxc_ctid }} -- bash -c
|
||||
"echo 'ansible ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/ansible &&
|
||||
chmod 440 /etc/sudoers.d/ansible"
|
||||
changed_when: true
|
||||
|
||||
# Verification de la syntaxe sudoers.
|
||||
# Important: une erreur sudoers peut casser sudo.
|
||||
- name: Verifier le fichier sudoers dans le CT
|
||||
command: pct exec {{ lxc_ctid }} -- visudo -cf /etc/sudoers.d/ansible
|
||||
changed_when: false
|
||||
|
||||
# On attend que le port SSH du nouveau LXC soit accessible
|
||||
# depuis ansible-srv.
|
||||
- name: Attendre SSH depuis ansible-srv
|
||||
wait_for:
|
||||
host: "{{ lxc_ip_address }}"
|
||||
port: 22
|
||||
timeout: 120
|
||||
delegate_to: localhost
|
||||
become: false
|
||||
|
||||
# Ajout automatique du nouveau LXC dans inventory/hosts.ini.
|
||||
#
|
||||
# blockinfile evite les doublons:
|
||||
# si le bloc existe deja, il est mis a jour.
|
||||
- name: Ajouter le nouveau LXC dans l inventaire Ansible
|
||||
blockinfile:
|
||||
path: "{{ lxc_inventory_file }}"
|
||||
marker: "# {mark} ANSIBLE MANAGED {{ lxc_hostname }}"
|
||||
block: |
|
||||
[{{ lxc_inventory_group }}]
|
||||
{{ lxc_hostname }} ansible_host={{ lxc_ip_address }} ansible_user={{ lxc_ansible_user }} ansible_python_interpreter={{ lxc_ansible_python_interpreter }}
|
||||
delegate_to: localhost
|
||||
become: false
|
||||
|
||||
- name: Verifier le statut final du CT
|
||||
command: pct status {{ lxc_ctid }}
|
||||
register: final_status
|
||||
changed_when: false
|
||||
|
||||
- name: Afficher le statut final du CT
|
||||
debug:
|
||||
var: final_status.stdout
|
||||
Reference in New Issue
Block a user