Vraag Uitgang shell van Ansible-playbook


Ik wil snel een aantal hosts controleren met behulp van commando's zoals ps, dstat, enz. Met behulp van ansible-playbook. De ansible commando zichzelf perfect doet wat ik wil, bijvoorbeeld zou ik gebruiken:

ansible -m shell -a "ps -eo pcpu,user,args | sort -r -k1 | head -n5"

en het drukt op mooie wijze alle std-uitvoer af voor elke host, zoals deze:

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] 

Dit vereist echter dat ik een aantal shell-scripts bijhoud voor elke taak die niet erg 'onmachtig' is, dus ik stop dit in een playbook:

---
-
  hosts: all
  gather_facts: no
  tasks:
    - shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5

en voer het uit met -vv, maar de uitvoer geeft duidelijk de inhoud van het woordenboek weer en nieuwe regels worden niet als zodanig afgedrukt, dus dit resulteert in een onleesbare puinhoop als deze:

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
.... 

Ik heb ook geprobeerd toe te voegen register: var en de a 'debug' taak om te laten zien {{ var.stdout }} maar het resultaat is natuurlijk hetzelfde.

Is er een manier om een ​​mooi geformatteerde uitvoer te krijgen van de stdout / stderr van een commando wanneer deze via een Playbook wordt uitgevoerd? Ik kan een aantal mogelijke manieren bedenken (formaat uitvoer met behulp van sed? Redirect uitvoer naar bestand op de host, dan krijg je dat bestand terug en herhaal het naar het scherm?), Maar met mijn beperkte kennis van de shell / ansible zou het me kosten een dag om het gewoon uit te proberen.


38
2017-12-13 10:01


oorsprong


antwoorden:


De debug module zou echt wat liefde kunnen gebruiken, maar op dit moment kun je het beste dit gebruiken:

- hosts: all
  gather_facts: no
  tasks:
    - shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
      register: ps

    - debug: var=ps.stdout_lines

Het geeft een uitvoer als deze:

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"
    ]
}

55
2017-07-18 21:43



Dit kan een begin zijn:

- 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

NOTITIE: Documenten over ps.stdout_lines zijn hier behandeld: ('Register Variables' hoofdstuk).


14
2017-12-13 11:00



Uitgaand van wat leucos in zijn antwoord zei, kun je ook informatie printen met Ansible's bescheiden 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

7
2018-03-08 03:06



Als je een specifieke exit-status nodig hebt, biedt Ansible een manier om dat via te doen callback-plug-ins.

Voorbeeld. Het is een zeer goede optie als u een 100% correcte exitstatus nodig hebt.

Zo niet, dan kunt u altijd de Debug Module, welke is de standaard- voor deze gevallen van gebruik.

Proost


2
2018-06-15 12:05



Ik vond het gebruik van de minimaal  stdout_callback met ansible-playbook gaf vergelijkbare output aan het gebruik van ad-hoc ansible.

In je ansible.cfg (merk op dat ik OS X gebruik dus wijzig de callback_plugins pad dat past bij uw installatie)

stdout_callback     = minimal
callback_plugins    = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ansible/plugins/callback

Dus dat een ansible-playbook taak zoals de jouwe

---
-
  hosts: example
  gather_facts: no
  tasks:
    - shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5

Geeft uitvoer zoals deze, zoals een ad-hoc commando dat zou doen

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]

Ik gebruik ansible-playbook 2.2.1.0


1
2018-04-06 11:13



ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook /tmp/foo.yml -vvv

Taken met STDOUT hebben dan een sectie:

STDOUT:

What ever was in STDOUT

0
2018-03-09 15:30



Misschien niet relevant als je dit ALLEEN wilt doen met behulp van ansible. Maar het is veel gemakkelijker voor mij om een ​​functie te hebben in mijn .bash_profile en ren dan _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
}

Bijv.

$ _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,
$ 

Onnodig te zeggen dat de functie niet voor u zal werken zoals het is. U moet het op de juiste manier bijwerken.


-1
2018-03-27 18:05