Подтвердить что ты не робот

Неизменный вывод оболочки

Я хотел бы быстро отслеживать некоторые хосты, используя команды ps, dstat и т.д., используя загрузочную книгу. Сама команда ansible делает то, что я хочу, например, я бы использовал:

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

и он красиво печатает весь вывод std для каждого хоста следующим образом:

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] 

Однако это требует от меня держать кучу оболочечных скриптов для каждой задачи, которая не очень "правдоподобна", поэтому я помещаю ее в учебник:

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

и запустите его с помощью -vv, но на выходе выводится содержимое словаря, а строки новой строки не печатаются таким образом, что приводит к нечитаемому беспорядку, подобному этому:

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

Я также попытался добавить register: var и задачу 'debug', чтобы показать {{ var.stdout }}, но результат, конечно, тот же.

Есть ли способ получить красиво отформатированный вывод из команды stdout/stderr при запуске через playbook? Я могу придумать несколько возможных способов (выход формата с помощью sed? Redirect output в файл на хосте, затем вернуть этот файл и отобразить его на экране?), Но с моими ограниченными знаниями о оболочке/возможно, мне понадобится в день, чтобы просто попробовать.

4b9b3361

Ответ 1

Модуль debug может действительно использовать некоторую любовь, но на данный момент лучше всего вы можете это сделать:

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

    - debug: var=ps.stdout_lines

Он выдает такой вывод:

ok: [host1] => {
    "ps.stdout_lines": [
        "%CPU USER     COMMAND",
        " 1.0 root     /usr/bin/python",
        " 0.6 root     sshd: [email protected] ",
        " 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: [email protected] ",
        " 0.1 root     java",
        " 0.0 root     sort -r -k1"
    ]
}

Ответ 2

Это начало может быть:

- 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

ПРИМЕЧАНИЕ. Документы, касающиеся ps.stdout_lines, рассматриваются здесь: (раздел "Регистрировать переменные" ).

Ответ 3

Развернувшись на том, что сказал лейкос в своем ответе, вы также можете распечатать информацию с помощью Ansible humble debug:

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

    # Print the shell task stdout.
    - debug: msg={{ ps.stdout }}

    # Print all contents of the shell task output.
    - debug: var=ps

Ответ 4

Если вам нужен определенный статус выхода, Ansible предоставляет способ сделать это с помощью плагинов обратного вызова.

Пример. Это очень хороший вариант, если вам нужен 100% точный статус выхода.

Если нет, вы всегда можете использовать Отладочный модуль, который является стандартом для этих случаев использования.

Приветствия

Ответ 5

Я нашел, используя minimal stdout_callback с помощью загружаемой книги с аналогичным выходом для использования ad-hoc ansible.

В вашем ansible.cfg(обратите внимание, что я на OS X, измените путь callback_plugins в соответствии с вашей установкой)

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

Итак, задача ansible-playbook, подобная вашей

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

Выдает такой вывод, как команда ad-hoc,

example | SUCCESS | rc=0 >>
%CPU USER     COMMAND
 0.2 root     sshd: [email protected]/3
 0.1 root     /usr/sbin/CROND -n
 0.0 root     [xfs-reclaim/vda]
 0.0 root     [xfs_mru_cache]

Я использую sim-playbook 2.2.1.0

Ответ 6

Возможно, это не имеет значения, если вы хотите сделать это ТОЛЬКО с использованием недоступного. Но мне гораздо легче иметь функцию в моем .bash_profile, а затем запустить _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 [email protected]$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
}

например.

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

Излишне говорить, что функция не будет работать для вас, как есть. Вам необходимо соответствующим образом обновить его.