Creation conteneur en utilisant LXD
Création d'un conteneur
Étapes préliminaires :
- Déterminer le hostname du futur conteneur
- Déterminer son adresse IPv6 principale en utilisant le plan_adressage. Vérifier que l'adresse choisie n'est pas utilisée (au minimum en essayant de la ping6)
- Editer la configuration DNS : dns
Création effective du conteneur
Sur l'hyperviseur lxd, lancer le script new-lxc-ct.sh
situé dans /root. Aucun paramètre n'est nécessaire. Le script demande le hostname et l'IPv6 principale a utiliser directement sur la stdin. Ce script crée le conteneur, le démarre, change ses dépots apt, le met à jour, installe python (nécessaire pour qu'ansible fonctionne par la suite) et définie les limites suivantes :
- CPU = 1 (
lxc config set ${hostname} limits.cpu 1
) - RAM = 256Mo (
lxc config set ${hostname} limits.memory 256MB
) - Pas de Swap (
lxc config set ${hostname} limits.memory.swap true
) - Taille du / = 5Go (
lxc config device set ${hostname} root size 5GB
)
Il est possible d'adapter ces limites après coup si nécessaire, en utilisant les commandes lxc config ...
.
Pour mémoire, la sortie du script quand il s'exécute correctement :
<HTML> <pre> root@karadoc:/root# ./new-lxc-ct.sh CT hostname ? test-doc IPv6 addr ? (ex: 2001:0912:3064:127::1) 2001:912:3064:134::1 Creating test-doc Starting test-doc Get:1 http://ftp.rezopole.net/ubuntu xenial InRelease [247 kB] Get:2 http://ftp.rezopole.net/ubuntu xenial-updates InRelease [102 kB] […] Fetched 16.3 MB in 6s (2508 kB/s) Reading package lists… Done Reading package lists… Done Building dependency tree Reading state information… Done The following additional packages will be installed:
libpython-stdlib libpython2.7-minimal libpython2.7-stdlib python-minimal python2.7 python2.7-minimal
Suggested packages:
python-doc python-tk python2.7-doc binutils binfmt-support
The following NEW packages will be installed:
libpython-stdlib libpython2.7-minimal libpython2.7-stdlib python python-minimal python2.7 python2.7-minimal
0 upgraded, 7 newly installed, 0 to remove and 18 not upgraded.
Need to get 3915 kB of archives.
After this operation, 16.6 MB of additional disk space will be used.
Get:1 http://ftp.rezopole.net/ubuntu xenial-updates/main amd64 libpython2.7-minimal amd64 2.7.12-1ubuntu0~16.04.1 [339 kB]
[…]
Fetched 3915 kB in 0s (11.8 MB/s)
Selecting previously unselected package libpython2.7-minimal:amd64.
[…]
Device eth0 added to test-doc
Fin de l'install, restart CT
</pre>
</HTML>
Une fois le conteneur crée, il doit apparaître dans le résultat de la commande lxc list
comme “RUNNING”.
Pour obtenir un prompt sur le conteneur directement depuis l'hyperviseur, on peut utiliser la commande lxc exec ${HOSTNAME} bash
Mise en place du réseau
- Sur l'hyperviseur, éditer le fichier
/etc/bird/bird6.conf
, et ajouter dans le “protocol static” une route pour le conteneur nouvellement crée. Ceci permet d'ajouter une route statique vers le /64 du conteneur. Cette même route est ensuite propagée automatiquement vers le routeur Perceval via bgp. - Vérifier la conf de bird6 avec la commande
birdc6 conf check
- Si la conf est ok, lancer la reconfiguration de bird6 avec la commande
birdc6 conf
- Si tous s'est bien passé, le conteneur est joignable depuis Internet (en IPv6) !
Si jamais le conteneur a besoin d'être accédé en IPv4 depuis l'extérieur, sur perceval:
- éditer le fichier
/etc/tayga.conf
pour y ajouter une ligne map faisant correspondre une IPv4 disponible avec l'ipv6 principale du conteneur. Puis redémarrer tayguasystemctl restart tayga
pour appliquer le changement. - éditer le fichier
/etc/bird/bird.conf
pour y ajouter une route en /32 vers l'interface nat64. Puis vérifier que la conf est syntaxiquement correcte avecbirdc configure check
; si c'est le cas, appliquer la conf avecbirdc configure
Dans le cas d'une configuration dual-stack ipv4 et ipv6 (karadoc par ex) on ne touche pas à bird / tayga et on utilise les résolveurs suivants:
cat /etc/resolv.conf nameserver 80.67.169.12 nameserver 2a00:5881:8100:1000::3 options timeout:1
Normalisation et installation des bases avec ansible
Depuis l'hyperviseur, utiliser la commande lxc exec ${HOSTNAME} bash
pour obtenir un prompt sur notre nouveau conteneur.<HTML></li></HTML>
Ajouter sa clef ssh, temporairement, au /root/.ssh/authorized_keys
du conteneur nouvellement crée<HTML></li></HTML>
Vérifier que l'on parvient à se connecter en SSH depuis sa machine.<HTML></li></HTML>
Sur sa propre machine, installer ansible et cloner le dépot git qui contient les rôles ansible:
sudo apt install git ansible mkdir ~/Hadoly cd ~/Hadoly git clone https://git.hadoly.fr/CS_CT/ansible_hadoly.git cd admin/ansible
Editer le fichier ansible/hosts
et ajouter le nouveau CT dans la section new, en suivant le modèle: 2001:912:3064:XXX ansible_user=root ansible_port=22
<HTML></li></HTML>
Exécuter le playbook ansible etckeeper.yml: ansible-playbook -l new etckeeper.yml
<HTML></li></HTML>
Éditer le fichier roles/base/vars/main.yml
ajouter la nouvelle machine. Executer le playbook main.yml avec la commande ansible-playbook -l new base.yml
<HTML></li></HTML>
Se connecter au conteneur en SSH avec son compte attitré.<HTML></li></HTML>
Initialiser son mot de passe sudo avec sudo passwd-init
.<HTML></li></HTML>
Supprimer sa clef ssh du /root/.ssh/authorized_keys
.<HTML></li></HTML>
Redémarrer ssh avec systemctl restart ssh
.<HTML></li></HTML>
A partir de cet instant, il faut se connecter en ssh sur le port 6900.<HTML></li></HTML>
Sur sa machine, éditer a nouveau le fichier ansible/hosts
, supprimer l'hote de la section new, le mettre dans la section conteneur avec tous les autres.<HTML></li></HTML>
'git commit et
git push'' pour posser sur le dépot git les modifications liées à l'ajout du nouveau conteneur.<HTML></li></HTML>
Ne pas oublier d'etc-commiter sur toutes les machines où il y a eu des changements de conf.<HTML></li></HTML><HTML></ul></HTML>
mettre à jour https://wiki.hadoly.fr/documentation_technique:machines