Salida de shell libro de jugadas Ansible
sed (7)
Ampliando lo que leucos dijo en su respuesta, también puede imprimir información con el humilde módulo de debug
Ansible:
- 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
Me gustaría monitorear rápidamente algunos hosts usando comandos como ps, dstat, etc. usando ansible-playbook. El comando ansible
hace perfectamente lo que yo quiero, por ejemplo, yo usaría:
ansible -m shell -a "ps -eo pcpu,user,args | sort -r -k1 | head -n5"
e imprime muy bien todos los resultados estándar para cada host como este:
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]
Sin embargo, esto me exige mantener un montón de scripts de shell para cada tarea que no sea muy ''ansible'', así que puse esto en un libro de jugadas:
---
-
hosts: all
gather_facts: no
tasks:
- shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
y ejecutarlo con -vv
, pero la salida muestra escasamente el contenido del diccionario y las nuevas líneas no se imprimen como tales, por lo que esto da como resultado un lío ilegible como este:
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 1920x1200/n
....
También intenté agregar register: var
y la tarea a ''debug'' para mostrar {{ var.stdout }}
pero el resultado es, por supuesto, el mismo.
¿Hay alguna manera de obtener una salida con buen formato de stdout / stderr de un comando cuando se ejecuta a través de un libro de jugadas? Puedo pensar en varias formas posibles (formato de salida usando sed? Redirigir salida a un archivo en el host luego recuperar ese archivo y repetirlo en la pantalla?), Pero con mi conocimiento limitado del shell / ansible me llevaría un día para simplemente probarlo.
El módulo de debug
realmente podría usar algo de amor, pero por el momento lo mejor que puedes hacer es usar esto:
- hosts: all
gather_facts: no
tasks:
- shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
register: ps
- debug: var=ps.stdout_lines
Da un resultado como este:
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"
]
}
Encontré usar el minimal stdout_callback
con ansible-playbook que dio resultados similares a usar ansible ad-hoc.
En su ansible.cfg (tenga en cuenta que estoy en OS X, modifique la ruta callback_plugins
para adaptarla a su instalación)
stdout_callback = minimal
callback_plugins = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ansible/plugins/callback
De modo que una tarea ansible-playbook
como la tuya
---
-
hosts: example
gather_facts: no
tasks:
- shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
Da resultados como este, como un comando ad-hoc haría
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]
Estoy usando ansible-playbook 2.2.1.0
Este es un comienzo puede ser:
- 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
NOTA: los documentos relacionados con ps.stdout_lines
se tratan aquí: (capítulo ''Registrar variables'') .
Quizás no sea relevante si lo que quiere hacer es SOLAMENTE usar ansible. Pero es mucho más fácil para mí tener una función en mi .bash_profile
y luego ejecutar _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=$1
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
}
P.ej
$ _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,
$
No hace falta decir que la función no funcionará para usted tal como es. Necesita actualizarlo apropiadamente.
Si necesita un estado de salida específico, Ansible proporciona una forma de hacerlo a través de los complementos de devolución de llamada .
Example . Es una muy buena opción si necesita un estado de salida 100% preciso.
De lo contrario, siempre puede usar el debug , que es el estándar para estos casos de uso.
Aclamaciones
ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook /tmp/foo.yml -vvv
Las tareas con STDOUT tendrán una sección:
STDOUT:
What ever was in STDOUT