Ansible行动手册shell输出

oalqel3c  于 2022-11-16  发布在  Shell
关注(0)|答案(9)|浏览(273)

我想使用ansible-playbook,使用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]

然而,这需要我为每个任务保留一堆shell脚本,这不是很容易做到的,所以我把它放在一个剧本中:

---
-
  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中获得格式良好的输出?我可以想到很多可能的方法(使用sed格式化输出?将输出重定向到主机上的文件,然后将该文件返回并将其回显到屏幕上?),但以我对shell/ansible有限的知识,我需要花一天的时间来尝试它。

falq053o

falq053o1#

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

up9lanfz2#

这是一个开始可能是:

- 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的文档:('Register Variables' chapter)

sulc1iza

sulc1iza3#

扩展leucos在他的回答中所说的,你也可以用Ansible的debug模块打印信息:

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

pepwfjgg4#

我发现使用 * minimal * stdout_callback和ansible剧本的输出与使用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

所以像你这样的任务

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

输出如下所示,类似于临时命令

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]

我使用的是一本神秘的剧本2.2.1.0

db2dz4w8

db2dz4w85#

ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook /tmp/foo.yml -vvv
具有STDOUT的任务将包含一个部分:

STDOUT:

What ever was in STDOUT
gjmwrych

gjmwrych6#

如果您需要一个特定的退出状态,Ansible提供了一种通过回调插件来实现的方法。
Example。如果您需要100%准确的退出状态,这是一个非常好的选择。
如果没有,您可以始终使用Debug Module,这是这种情况下使用的 * 标准 *。
干杯

zynd9foi

zynd9foi7#

对我来说,唯一有效的(因为register+with_items组合)是:

- name: "download and distribute certs"
  shell: "python3 /tmp/bla.py {{ item.name }}"
  register: python3
  with_items: "{{ my_list }}"

- debug: msg="{{ item.stdout_lines | join("\n") }}"
  with_items: "{{ python3['results'] }}"
az31mfrm

az31mfrm8#

如果您只想使用ansible来实现这一点,那么这可能与此无关。但是,对我来说,在.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 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
}

例如:

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

不用说,这个功能现在对你来说是不起作用的。你需要适当地更新它。

vecaoik1

vecaoik19#

我个人在一本剧本中有几个shell或命令调用,并将其输出到不同的变量。最后,我总结了这些信息,并一次列出如下:

- ansible.builtin.shell: "df -h"
  register: disk

- ansible.builtin.shell: "free -m"
  register: mem

.....

- name: Summarize
  local_action: ansible.builtin.debug var={{ item }}
  become: no
  with_items: 
    - disk.stdout_lines
    - mem.stdout_lines

如果你用

ANSIBLE_STDOUT_CALLBACK=minimal ansible-playbook getServerInfo.yml

它会给出一个漂亮干净的输出

相关问题