Неизменный вывод оболочки
Я хотел бы быстро отслеживать некоторые хосты, используя команды 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 в файл на хосте, затем вернуть этот файл и отобразить его на экране?), Но с моими ограниченными знаниями о оболочке/возможно, мне понадобится в день, чтобы просто попробовать.
Ответы
Ответ 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,
$
Излишне говорить, что функция не будет работать для вас, как есть. Вам необходимо соответствующим образом обновить его.