shell sed ansible

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