Ansible playbook shell de sortie
je voudrais surveiller rapidement certains hôtes en utilisant des commandes comme ps, dstat, etc en utilisant ansible-playbook. ansible
commande en elle-même est tout à fait ce que je veux, par exemple j'utilise:
ansible -m shell -a "ps -eo pcpu,user,args | sort -r -k1 | head -n5"
et bien imprime toutes les mst sortie pour chaque hôte comme ceci:
localhost | success | rc=0 >>
0.0 root /sbin/init
0.0 root [kthreadd]
0.0 root [ksoftirqd/0]
0.0 root [migration/0]
otherhost | success | rc=0 >>
0.0 root /sbin/init
0.0 root [kthreadd]
0.0 root [ksoftirqd/0]
0.0 root [migration/0]
cependant cela me demande de garder un tas de scripts shell autour de chaque tâche qui n'est pas très "possible" donc je l'ai mis dans un playbook:
---
-
hosts: all
gather_facts: no
tasks:
- shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
et l'exécuter avec -vv
, mais la sortie montre baiscally le contenu du dictionnaire et les nouvelles lignes ne sont pas imprimées en tant que telles, de sorte que cela résulte en un désordre illisible comme ceci:
changed: [localhost] => {"changed": true, "cmd": "ps -eo pcpu,user,args | sort -r -k1
head -n5 ", "delta": "0:00:00.015337", "end": "2013-12-13 10:57:25.680708", "rc": 0,
"start": "2013-12-13 10:57:25.665371", "stderr": "", "stdout": "47.3 xxx Xvnc4 :24
-desktop xxx:24 (xxx) -auth /home/xxx/.Xauthority -geometry 1920x1200n
....
j'ai aussi essayé d'ajouter register: var
et a 'debug' tâche pour afficher {{ var.stdout }}
mais le résultat est évidemment le même.
y a-t-il un moyen d'obtenir une sortie joliment formatée à partir d'une commande stdout/stderr lorsqu'elle est exécutée via un playbook? Je peux penser à un certain nombre de moyens possibles (format de sortie en utilisant sed? rediriger la sortie vers un fichier sur l'hôte obtenir ce fichier et d'écho à l'écran?), mais avec ma connaissance limitée de la coquille / possible, il me faudrait un jour pour l'essayer.
7 réponses
debug
module pourrait utiliser un peu d'amour, mais pour le moment le meilleur que vous pouvez faire est d'utiliser ceci:
- hosts: all
gather_facts: no
tasks:
- shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
register: ps
- debug: var=ps.stdout_lines
Il donne une sortie comme ceci:
ok: [host1] => {
"ps.stdout_lines": [
"%CPU USER COMMAND",
" 1.0 root /usr/bin/python",
" 0.6 root sshd: root@notty ",
" 0.2 root java",
" 0.0 root sort -r -k1"
]
}
ok: [host2] => {
"ps.stdout_lines": [
"%CPU USER COMMAND",
" 4.0 root /usr/bin/python",
" 0.6 root sshd: root@notty ",
" 0.1 root java",
" 0.0 root sort -r -k1"
]
}
C'est un début, peut-être :
- hosts: all
gather_facts: no
tasks:
- shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
register: ps
- local_action: command echo item
with_items: ps.stdout_lines
NOTE: Docs concernant ps.stdout_lines
sont abordés ici: (chapitre "variables du registre").
en développant sur ce que leucos a dit dans sa réponse, vous pouvez également imprimer l'information avec l'humble D'Ansible debug
module:
- hosts: all
gather_facts: no
tasks:
- shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
register: ps
# Print the shell task's stdout.
- debug: msg={{ ps.stdout }}
# Print all contents of the shell task's output.
- debug: var=ps
Si vous avez besoin d'un statut de sortie, Ansible fournit un moyen de le faire via rappel des plugins.
Exemple. C'est une très bonne option si vous avez besoin d'un statut de sortie 100% précis.
Si non, vous pouvez toujours utiliser le Module De Débogage standard pour ce cas d'utilisation.
Cheers
j'ai trouvé en utilisant le minimumstdout_callback
avec ansible-playbook a donné des résultats similaires à l'utilisation ad-hoc ansible.
dans votre ansible.cfg (notez que je suis sur OS X alors modifiez le callback_plugins
chemin d'accès à la fonction de votre installation)
stdout_callback = minimal
callback_plugins = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ansible/plugins/callback
Ainsi qu'une ansible-playbook
tâche comme la vôtre
---
-
hosts: example
gather_facts: no
tasks:
- shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
donne une sortie comme celle-ci, comme une commande ad-hoc
example | SUCCESS | rc=0 >>
%CPU USER COMMAND
0.2 root sshd: root@pts/3
0.1 root /usr/sbin/CROND -n
0.0 root [xfs-reclaim/vda]
0.0 root [xfs_mru_cache]
j'utilise ansible-playbook 2.2.1.0
ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook /tmp/foo.yml -vvv
Tâches avec STDOUT en aura une section:
STDOUT:
What ever was in STDOUT
peut-être pas pertinent si vous cherchez à faire ceci seulement en utilisant ansible. Mais il est beaucoup plus facile pour moi d'avoir une fonction dans mon .bash_profile
et puis exécutez _check_machine host1 host2
function _check_machine() {
echo 'hostname,num_physical_procs,cores_per_procs,memory,Gen,RH Release,bios_hp_power_profile,bios_intel_qpi_link_power_management,bios_hp_power_regulator,bios_idle_power_state,bios_memory_speed,'
hostlist=
for h in `echo $hostlist | sed 's/ /\n/g'`;
do
echo $h | grep -qE '[a-zA-Z]'
[ $? -ne 0 ] && h=plabb$h
echo -n $h,
ssh root@$h 'grep "^physical id" /proc/cpuinfo | sort -u | wc -l; grep "^cpu cores" /proc/cpuinfo |sort -u | awk "{print $4}"; awk "{print $2/1024/1024; exit 0}" /proc/meminfo; /usr/sbin/dmidecode | grep "Product Name"; cat /etc/redhat-release; /etc/facter/bios_facts.sh;' | sed 's/Red at Enterprise Linux Server release //g; s/.*=//g; s/\tProduct Name: ProLiant BL460c //g; s/-//g' | sed 's/Red Hat Enterprise Linux Server release //g; s/.*=//g; s/\tProduct Name: ProLiant BL460c //g; s/-//g' | tr "\n" ","
echo ''
done
}
E. G.
$ _machine_info '10 20 1036'
hostname,num_physical_procs,cores_per_procs,memory,Gen,RH Release,bios_hp_power_profile,bios_intel_qpi_link_power_management,bios_hp_power_regulator,bios_idle_power_state,bios_memory_speed,
plabb10,2,4,47.1629,G6,5.11 (Tikanga),Maximum_Performance,Disabled,HP_Static_High_Performance_Mode,No_CStates,1333MHz_Maximum,
plabb20,2,4,47.1229,G6,6.6 (Santiago),Maximum_Performance,Disabled,HP_Static_High_Performance_Mode,No_CStates,1333MHz_Maximum,
plabb1036,2,12,189.12,Gen8,6.6 (Santiago),Custom,Disabled,HP_Static_High_Performance_Mode,No_CStates,1333MHz_Maximum,
$
Inutile de dire que la fonction ne fonctionnera pas pour vous qu'elle l'est. Vous devez le mettre à jour de façon appropriée.