Une console Ansible interactive bien utile
Publié le :
L’utilitaire, peu connu, ansible-console est présenté comme étant une console REPL (Read–Evaluate–Print Loop). ansible-console permet de lancer de manière interactive des actions ansible « ligne par ligne », donc chaque ligne saisie est immédiatement traitée et le résultat affiché, puis le prompt réapparaît. Les effets des instructions exécutées sont préservées, donc l’état du système sous-jacent change à mesure.
Utilisation de la console Ansible
La commande ansible-console est très riche et reprend en grande partie les
options de la commande ansible-playbook. Le mieux est de lancer la commande
ansible-console --help
:
usage: ansible-console [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD] [--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts] [-l SUBSET] [-k] [--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER] [-c CONNECTION] [-T TIMEOUT] [--ssh-common-args SSH_COMMON_ARGS] [--sftp-extra-args SFTP_EXTRA_ARGS] [--scp-extra-args SCP_EXTRA_ARGS] [--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D][--vault-id VAULT_IDS] [--ask-vault-password | --vault-password-file VAULT_PASSWORD_FILES] [-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR] [--step] [pattern]
On peut ainsi configurer le moyen de connexion (private-key, remote_user, ssh-common-args, …), de faire de l’élévation de privilège (become), de demander un mot de passe pour déchiffrer un/des vault(s), d’indiquer le user, et d’indiquer un inventaire à utiliser.
Lancer la console sur un inventaire
Il suffit d’utiliser le paramètre -i
qui peut être compléter par le paramètre
-l
ou --limit
Par exemple j’ai cet inventaire :
[webservers]host1host2
[dbservers]host3
dont les machines sont créés avec vagrant:
# -*- mode: ruby -*-# vi: set ft=ruby :
NODES = [ { :hostname => "host1", :ip => "192.168.3.11" }, { :hostname => "host2", :ip => "192.168.3.12" }, { :hostname => "host3", :ip => "192.168.3.13" }]
Vagrant.configure("2") do |config| config.vm.box = "generic/oracle8" config.vm.provider "libvirt" do |hv| hv.cpus = "1" hv.memory = "512" end config.vm.synced_folder '.', '/vagrant', disabled: true NODES.each do |node| config.vm.define node[:hostname] do |nodeconfig| nodeconfig.vm.hostname = node[:hostname] nodeconfig.vm.network :private_network, ip: node[:ip] nodeconfig.vm.provision "ansible" do |a| a.playbook = "provision-playbook.yml" end end endend
et le playbook provision-playbook.yml (ce playbook ne fait que la configuration du host):
---- hosts: all gather_facts: no become: true
tasks: - name: Replace a localhost entry with our own lineinfile: path: /etc/hosts regexp: '^127\.0\.0\.1' line: 127.0.0.1 localhost owner: root group: root mode: '0644'
- name: Allow password authentication lineinfile: path: /etc/ssh/sshd_config regexp: "^PasswordAuthentication" line: "PasswordAuthentication yes" state: present notify: restart sshd
- name: Set authorized key took from file authorized_key: user: vagrant state: present key: "{{ lookup('file', '/home/vagrant/.ssh/id_ed25519.pub') }}"
handlers: - name: restart sshd service: name: sshd
On peut maintenant lancer la console ansible sur cet inventaire et lançons la commande help qui affichera toutes les commandes disponibles:
ansible-console -i inventaire -b -u vagrantWelcome to the ansible console.Type help or ? to list commands.
vagrant@all (3)[f:5]$ ?
Documented commands (type help <topic>):========================================EOF dnf include_role service_factsadd_host dpkg_selections include_tasks set_factapt exit include_vars set_statsapt_key expect iptables setupapt_repository fail known_hosts shellassemble fetch lineinfile slurpassert file list statasync_status find meta subversionasync_wrapper forks package systemdbecome gather_facts package_facts sysvinitbecome_method get_url pause tempfilebecome_user getent ping templateblockinfile git pip unarchivecd group raw uricheck group_by reboot usercommand help remote_user verbositycopy hostname replace wait_forcron import_playbook rpm_key wait_for_connectiondebconf import_role script yumdebug import_tasks serial yum_repositorydiff include service
Pour obtenir la documentation sur une commande help commande. Par exemple
help package
Generic OS package managerParameters: name Package name, or package specifier with version. state Whether to install (C(present)), or remove (C(absent)) a package. use The required package manager module to use (`yum`, `apt`, and so on). The default 'auto' will use existing facts or try to autodetect it.
Lancer des modules ansible
Pour lancer par exemple pour le lancer module package et installer nmap-ncat (redhat):
package name=nmap-ncat state=present
host1 | CHANGED => { "changed": true, "msg": "", "rc": 0, "results": [ "Installed: nmap-ncat-2:7.70-5.el8.x86_64" ]}host3 | CHANGED => { "changed": true, "msg": "", "rc": 0, "results": [ "Installed: nmap-ncat-2:7.70-5.el8.x86_64" ]}host2 | CHANGED => { "changed": true, "msg": "", "rc": 0, "results": [ "Installed: nmap-ncat-2:7.70-5.el8.x86_64" ]}
Je ne vais pas documenter l’ensemble des modules à disposition.
Se déplacer dans l’inventaire
A tout moment, vous pouvez vous déplacer dans l’inventaire avec la commande cd
et
afficher la liste des machines avec la commande list
.
vagrant@all (3)[f:5]# cd webserversvagrant@webservers (2)[f:5]# lshost2 | CHANGED | rc=0 >>
host1 | CHANGED | rc=0 >>
vagrant@webservers (2)[f:5]# listhost1host2
Pour revenir à la racine un simple cd
.
Obtenir de l’information sur les hosts
On peut utiliser les modules gather_facts
package_facts
et service_facts
pour
obtenir de l’information sur les machines de votre inventaire.
gather_facts
...
], "ansible_system_capabilities_enforced": "True", "ansible_system_vendor": "Red Hat", "ansible_uptime_seconds": 50, "ansible_user_dir": "/root", "ansible_user_gecos": "root", "ansible_user_gid": 0, "ansible_user_id": "root", "ansible_user_shell": "/bin/bash", "ansible_user_uid": 0, "ansible_userspace_architecture": "x86_64", "ansible_userspace_bits": "64", "ansible_virtualization_role": "guest", "ansible_virtualization_type": "kvm", "gather_subset": [ "all" ], "module_setup": true }, "changed": false, "deprecations": [], "warnings": []}
Sortir de la console
Pour sortir de la console exit
ou [CTRL]+[D]
Je pense que cet outil permet encore d’autres choses, mais manque cruellement de documentations et de tutorials.
Si vous voulez plus de tutorials Ansible je vous renvoie sur le billet de l’introduction à ansible