Aller au contenu principal

Une console Ansible interactive bien utile

· 5 minutes de lecture
Stéphane ROBERT

logo ansible

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]
host1
host2

[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
end
end

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 vagrant
Welcome 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_facts
add_host dpkg_selections include_tasks set_fact
apt exit include_vars set_stats
apt_key expect iptables setup
apt_repository fail known_hosts shell
assemble fetch lineinfile slurp
assert file list stat
async_status find meta subversion
async_wrapper forks package systemd
become gather_facts package_facts sysvinit
become_method get_url pause tempfile
become_user getent ping template
blockinfile git pip unarchive
cd group raw uri
check group_by reboot user
command help remote_user verbosity
copy hostname replace wait_for
cron import_playbook rpm_key wait_for_connection
debconf import_role script yum
debug import_tasks serial yum_repository
diff include service

Pour obtenir la documentation sur une commande help commande. Par exemple

help package

Generic OS package manager
Parameters:
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 webservers
vagrant@webservers (2)[f:5]# ls
host2 | CHANGED | rc=0 >>

host1 | CHANGED | rc=0 >>

vagrant@webservers (2)[f:5]# list
host1
host2

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