Votre premier projet avec la CLI¶
Dans ce tutoriel, vous allez construire un petit projet d’infrastructure à partir d’un répertoire vide, en utilisant uniquement la ligne de commande kikx. À la fin, vous aurez :
un inventaire Ansible avec deux groupes de serveurs et un groupe parent ;
des group vars pour les deux groupes ;
un playbook avec deux plays, dont l’un n’exécute un rôle que si une condition est remplie ;
un point d’entrée
site.ymlet les trois rôles dont le playbook a besoin ;un
ansible.cfgqui indique à Ansible où se trouvent l’inventaire et les rôles ;un Deployment Kubernetes et un Service qui le sélectionne ;
et vous aurez vérifié avec Ansible lui-même que l’inventaire se charge et que les playbooks sont analysés sans erreur.
Comptez environ quinze minutes.
Avant de commencer¶
Il vous faut :
un terminal sous macOS, Linux ou Windows ;
uv, que vous utiliserez à la fin pour exécuter Ansible sans l’installer.
Installer kikx¶
Téléchargez l’archive correspondant à votre plateforme depuis la page des versions de kikx :
Plateforme |
Archive |
|---|---|
macOS, Apple silicon |
|
macOS, Intel |
|
Linux, x64 |
|
Linux, arm64 |
|
Windows, x64 |
|
Décompressez-la et placez le binaire kikx (kikx.exe sous Windows) dans un répertoire de votre PATH.
Si vous disposez d’une chaîne d’outils Rust, vous pouvez plutôt le construire et l’installer depuis les sources :
cargo install --git https://github.com/yokwejuste/kikx kikx
Vérifiez qu’elle fonctionne :
kikx --version
kikx 0.0.1
Créer le projet¶
Créez un nouveau répertoire vide pour le projet et placez-vous dedans. Tout le reste de ce tutoriel se passe à l’intérieur.
mkdir platform
cd platform
kikx init --name platform --dir infra
Vous devriez voir :
Initialized kikx project `platform` — vendor components with `kikx add <category>/<component>` (see `kikx list`)
kikx a créé deux choses : un fichier kikx.toml et un répertoire infra/ vide. Regardez le fichier :
cat kikx.toml
[project]
name = "platform"
default_namespace = "default"
output_dir = "infra"
output_dir est le répertoire de sortie : chaque fichier que vous ajouterez désormais y sera écrit.
Voir ce que vous pouvez ajouter¶
kikx list
La sortie liste tous les composants que kikx connaît, avec les valeurs que chacun accepte. Vous devriez voir la partie que vous utiliserez en premier sous cette forme :
ansible/inventory — Hosts, groups, nesting and shared vars for servers you already have.
--set hosts=… (required)
--set default_user=… (default root)
--set default_port=… (default 22)
Tous les composants s’ajoutent de la même façon : kikx add <category>/<name> --name <name>, avec --set key=value pour leurs valeurs.
Ajouter un inventaire¶
Votre plateforme compte deux serveurs web et un serveur de base de données. Ajoutez un inventaire qui les place dans un groupe web et un groupe db, imbrique ces deux groupes dans un groupe platform, et se connecte avec l’utilisateur deploy :
kikx add ansible/inventory --name platform --set default_user=deploy --set hosts='[
{"group": "web", "members": [
{"name": "web-01", "ansible_host": "192.0.2.10"},
{"name": "web-02", "ansible_host": "192.0.2.11"}
]},
{"group": "db", "members": [
{"name": "db-01", "ansible_host": "198.51.100.20"}
]},
{"group": "platform", "children": ["web", "db"], "vars": {"ansible_python_interpreter": "/usr/bin/python3"}}
]'
kikx vous indique le fichier qu’il a écrit. Il affiche le chemin complet, abrégé ici :
Vendored …/platform/infra/platform-inventory.ini
Ouvrez-le :
cat infra/platform-inventory.ini
[web]
web-01 ansible_host=192.0.2.10 ansible_user=deploy ansible_port=22
web-02 ansible_host=192.0.2.11 ansible_user=deploy ansible_port=22
[db]
db-01 ansible_host=198.51.100.20 ansible_user=deploy ansible_port=22
[platform:children]
web
db
[platform:vars]
ansible_python_interpreter=/usr/bin/python3
C’est un inventaire Ansible ordinaire. Rien dedans ne renvoie à kikx : il vous appartient, vous pouvez le modifier, et il reste valide même si vous ne relancez jamais kikx. Vendoriser de vrais fichiers explique pourquoi kikx fonctionne ainsi.
Ajouter des group vars¶
Donnez deux valeurs simples au groupe web :
kikx add ansible/group-vars --name web --set group=web --set vars='{"http_port": "8080", "server_name": "www.example.com"}'
Vendored …/platform/infra/group_vars/web.yml
Les réglages de la base de données sont imbriqués : passez-les plutôt en YAML brut, et placez-les dans un dossier :
kikx add ansible/group-vars --name db --set group=db --set layout=dir --set yaml='postgres:
version: 16
max_connections: 200'
Vendored …/platform/infra/group_vars/db/main.yml
Regardez les deux fichiers :
cat infra/group_vars/web.yml infra/group_vars/db/main.yml
---
http_port: 8080
server_name: www.example.com
---
postgres:
version: 16
max_connections: 200
Le dossier group_vars/ se trouve juste à côté de l’inventaire, là où Ansible le cherche.
Ajouter un playbook avec deux plays¶
Indiquez maintenant ce qui s’exécute et où. Un seul playbook, services, reçoit deux plays : nginx sur les serveurs web, puis postgres et backups sur le serveur de base de données. Le rôle backups ne s’exécute que si backups_enabled est vrai, ce qui est le cas tant que personne ne le désactive :
kikx add ansible/playbook --name services --set folder=playbooks --set plays='[
{"name": "Web tier", "hosts": "web", "tags": ["web"], "roles": ["nginx"]},
{"name": "Database tier", "hosts": "db", "tags": ["db"], "roles": ["postgres", {"role": "backups", "when": "backups_enabled | default(true)"}]}
]'
Vendored …/platform/infra/playbooks/services.yml
cat infra/playbooks/services.yml
---
- name: Web tier
hosts: web
become: true
tags: [web]
roles:
- nginx
- name: Database tier
hosts: db
become: true
tags: [db]
roles:
- postgres
- role: backups
when: backups_enabled | default(true)
Chaque play cible un groupe de votre inventaire. become: true est écrit parce que vous ne l’avez pas désactivé.
Ajouter le playbook site¶
site.yml est le point d’entrée unique qui importe vos playbooks dans l’ordre :
kikx add ansible/site --name site --set playbooks='[
{"name": "Services", "path": "playbooks/services.yml"}
]'
Vendored …/platform/infra/site.yml
cat infra/site.yml
---
- name: Services
import_playbook: playbooks/services.yml
Ajouter les rôles¶
Le playbook exécute trois rôles qui n’existent pas encore. Ajoutez un squelette vide pour chacun :
kikx add ansible/role --name nginx
kikx add ansible/role --name postgres
kikx add ansible/role --name backups
Chaque commande écrit quatre fichiers. Pour nginx, vous devriez voir :
Vendored …/platform/infra/roles/nginx/tasks/main.yml
Vendored …/platform/infra/roles/nginx/defaults/main.yml
Vendored …/platform/infra/roles/nginx/handlers/main.yml
Vendored …/platform/infra/roles/nginx/meta/main.yml
Regardez le fichier de tâches :
cat infra/roles/nginx/tasks/main.yml
---
- name: Placeholder — replace with the real tasks for nginx
ansible.builtin.debug:
msg: "nginx ran on {{ inventory_hostname }}"
kikx vous fournit la structure ; c’est à vous d’écrire les tâches. La tâche provisoire fonctionne, si bien que le projet est exécutable tout de suite.
Ajouter une configuration Ansible¶
Le playbook se trouve dans playbooks/, mais les rôles se trouvent dans roles/, à la racine de infra/. Ansible cherche les rôles à côté du playbook : il ne les trouverait donc pas tout seul. Un ansible.cfg lui indique où ils sont, ainsi que l’inventaire à utiliser :
kikx add ansible/config --name ansible --set inventory=platform-inventory.ini
Vendored …/platform/infra/ansible.cfg
cat infra/ansible.cfg
[defaults]
inventory = platform-inventory.ini
roles_path = roles
roles_path a conservé sa valeur par défaut, roles.
Ajouter un Deployment et un Service¶
La plateforme exécute aussi une application web sur Kubernetes. Ajoutez un Deployment avec deux réplicas de nginx:1.27, et un Service du même nom :
kikx add k8s/deployment --name web --image nginx:1.27 --replicas 2
kikx add k8s/service --name web
Vendored …/platform/infra/web-deployment.yaml
Vendored …/platform/infra/web-service.yaml
Regardez les deux manifestes :
cat infra/web-deployment.yaml infra/web-service.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
labels:
app: web
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.27
ports:
- containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: web
namespace: default
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
protocol: TCP
Remarquez app: web dans les deux : les pods portent ce label et le Service le sélectionne, car les deux prennent par défaut le nom que vous leur avez donné. Le namespace, default, vient de kikx.toml.
Examiner le projet complet¶
find infra -type f | sort
infra/ansible.cfg
infra/group_vars/db/main.yml
infra/group_vars/web.yml
infra/platform-inventory.ini
infra/playbooks/services.yml
infra/roles/backups/defaults/main.yml
infra/roles/backups/handlers/main.yml
infra/roles/backups/meta/main.yml
infra/roles/backups/tasks/main.yml
infra/roles/nginx/defaults/main.yml
infra/roles/nginx/handlers/main.yml
infra/roles/nginx/meta/main.yml
infra/roles/nginx/tasks/main.yml
infra/roles/postgres/defaults/main.yml
infra/roles/postgres/handlers/main.yml
infra/roles/postgres/meta/main.yml
infra/roles/postgres/tasks/main.yml
infra/site.yml
infra/web-deployment.yaml
infra/web-service.yaml
Vingt fichiers ordinaires, et un kikx.toml à côté.
Vérifier avec Ansible¶
Assurez-vous maintenant qu’Ansible est d’accord. Placez-vous dans le répertoire de sortie :
cd infra
Demandez à Ansible de dessiner l’inventaire. uvx récupère ansible-core la première fois, ce qui prend un moment :
uvx --from ansible-core ansible-inventory -i platform-inventory.ini --graph
@all:
|--@ungrouped:
|--@platform:
| |--@web:
| | |--web-01
| | |--web-02
| |--@db:
| | |--db-01
Demandez ce qu’Ansible sait de db-01 :
uvx --from ansible-core ansible-inventory -i platform-inventory.ini --host db-01
{
"ansible_host": "198.51.100.20",
"ansible_port": 22,
"ansible_python_interpreter": "/usr/bin/python3",
"ansible_user": "deploy",
"postgres": {
"max_connections": 200,
"version": 16
}
}
L’hôte a récupéré son adresse depuis l’inventaire, l’interpréteur depuis [platform:vars], et les réglages postgres depuis group_vars/db/main.yml.
Enfin, vérifiez que les playbooks sont analysés sans erreur et trouvent leurs rôles. Vous êtes dans le répertoire qui contient ansible.cfg : Ansible connaît donc déjà l’inventaire et le chemin des rôles :
uvx --from ansible-core ansible-playbook site.yml --syntax-check
playbook: site.yml
Listez les tâches que chaque play exécuterait :
uvx --from ansible-core ansible-playbook site.yml --list-tasks
playbook: site.yml
play #1 (web): Web tier TAGS: [web]
tasks:
nginx : Placeholder — replace with the real tasks for nginx TAGS: [web]
play #2 (db): Database tier TAGS: [db]
tasks:
postgres : Placeholder — replace with the real tasks for postgres TAGS: [db]
backups : Placeholder — replace with the real tasks for backups TAGS: [db]
Vous devriez voir les deux plays, dans l’ordre, chacun sur son groupe, avec le rôle conditionnel backups à sa place.
Modifier quelque chose¶
Revenez à la racine du projet et passez l’application web à trois réplicas en ajoutant de nouveau le Deployment :
cd ..
kikx add k8s/deployment --name web --image nginx:1.27 --replicas 3
Error: …/platform/infra/web-deployment.yaml already exists — pass --force to overwrite
kikx n’écrase jamais, sans qu’on le lui demande, un fichier que vous avez pu modifier. Demandez-le-lui :
kikx add k8s/deployment --name web --image nginx:1.27 --replicas 3 --force
grep replicas infra/web-deployment.yaml
Vendored …/platform/infra/web-deployment.yaml
replicas: 3
Ce que vous avez fait¶
Vous avez créé un projet kikx, ajouté un inventaire, des group vars, un playbook à deux plays avec une condition de rôle, un playbook site, trois squelettes de rôles, une configuration Ansible ainsi qu’un Deployment et un Service Kubernetes, puis vous avez confirmé avec Ansible que l’inventaire se résout et que les playbooks sont analysés sans erreur. Chaque fichier est ordinaire et modifiable, et aucun ne dépend de kikx.
Essayez ensuite Construire une plateforme Ansible dans le tableau de bord pour construire le même genre de projet visuellement, avec des vérifications qui repèrent les erreurs au fur et à mesure.
Pour aller plus loin :
démarrer le prochain projet depuis un template prêt à l’emploi : Démarrer depuis un template ;
toutes les commandes et options : CLI ;
tous les composants et les valeurs qu’ils acceptent : Composants ;
pourquoi kikx écrit des fichiers au lieu d’installer un paquet : Vendoriser de vrais fichiers ;
comment un composant devient un fichier : Comment fonctionne le rendu.