Aller au contenu principal

Une console Ansible interactive bien utile

· 5 minutes de lecture
Stéphane ROBERT
Consultant DevOps

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