使用 Ansible 查找进程数
Find the number of processes using Ansible
下面是我的剧本,它转储了匹配 .*httpd.*|.*sjsws.*|.*java.*|.*docker.*|.*node.*
的进程
剧本:
vars:
grepelement: ".*httpd.*|.*sjsws.*|.*java.*|.*docker.*|.*node.*"
- name: "Check processes on destination"
ignore_errors: yes
command: ps auxwww
register: ps_out
- set_fact:
processdump: "{{ ps_out.stdout | regex_findall(grepelement) }}"
- set_fact:
processdumpcount: "{{ ps_out.stdout.split() | length }}"
不幸的是,虽然只有 4 个进程 运行 计数似乎打印了超过 1000 秒,这可能是输出中的字符数。
我也尝试了下面的方法,但这也打印了超过进程数 运行。
- set_fact:
processdumpcount: "{{ ps_out.stdout_lines | length }}"
我可以使用 command: ps auxwww | wc -l
作为解决方案,但更喜欢使用单个 ps
命令的解决方案。
你能推荐一下吗?
您需要检查 processdump
寄存器的长度以获得计数 而不是 ps_out.stdout_lines
- set_fact:
processdumpcount: "{{ processdump | length }}"
请注意,ps_out
保留了系统上的所有进程 运行,稍后您将使用 ps_out
和 regex_findall
来过滤掉匹配的进程processdump
。您需要注册 processdump
的 length
。
最小工作示例:
我的系统进程数:
ps auxwww |wc -l
287
ps auxwww |grep -E ".*httpd.*|.*sjsws.*|.*java.*|.*docker.*|.*node.*" |grep -v grep |wc -l
3
剧本:
---
- name: Sample playbook
connection: local
# gather_facts: false
hosts: localhost
vars:
grepelement: ".*httpd.*|.*sjsws.*|.*java.*|.*docker.*|.*node.*"
tasks:
- name: "Check processes on destination"
ignore_errors: yes
command: ps auxwww
register: ps_out
- set_fact:
processdump: "{{ ps_out.stdout | regex_findall(grepelement) }}"
- set_fact:
processdumpcount: "{{ processdump | length }}"
- debug: msg="{{ processdumpcount }}"
以上剧本将导致:
PLAY [Sample playbook] **********************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************
ok: [localhost]
TASK [Check processes on destination] *******************************************************************************************************************************
changed: [localhost]
TASK [set_fact] *****************************************************************************************************************************************************
ok: [localhost]
TASK [set_fact] *****************************************************************************************************************************************************
ok: [localhost]
TASK [debug] ********************************************************************************************************************************************************
ok: [localhost] => {
"msg": "3"
}
PLAY RECAP **********************************************************************************************************************************************************
localhost : ok=5 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
下面是我的剧本,它转储了匹配 .*httpd.*|.*sjsws.*|.*java.*|.*docker.*|.*node.*
剧本:
vars:
grepelement: ".*httpd.*|.*sjsws.*|.*java.*|.*docker.*|.*node.*"
- name: "Check processes on destination"
ignore_errors: yes
command: ps auxwww
register: ps_out
- set_fact:
processdump: "{{ ps_out.stdout | regex_findall(grepelement) }}"
- set_fact:
processdumpcount: "{{ ps_out.stdout.split() | length }}"
不幸的是,虽然只有 4 个进程 运行 计数似乎打印了超过 1000 秒,这可能是输出中的字符数。
我也尝试了下面的方法,但这也打印了超过进程数 运行。
- set_fact:
processdumpcount: "{{ ps_out.stdout_lines | length }}"
我可以使用 command: ps auxwww | wc -l
作为解决方案,但更喜欢使用单个 ps
命令的解决方案。
你能推荐一下吗?
您需要检查 processdump
寄存器的长度以获得计数 而不是 ps_out.stdout_lines
- set_fact:
processdumpcount: "{{ processdump | length }}"
请注意,ps_out
保留了系统上的所有进程 运行,稍后您将使用 ps_out
和 regex_findall
来过滤掉匹配的进程processdump
。您需要注册 processdump
的 length
。
最小工作示例:
我的系统进程数:
ps auxwww |wc -l
287
ps auxwww |grep -E ".*httpd.*|.*sjsws.*|.*java.*|.*docker.*|.*node.*" |grep -v grep |wc -l
3
剧本:
---
- name: Sample playbook
connection: local
# gather_facts: false
hosts: localhost
vars:
grepelement: ".*httpd.*|.*sjsws.*|.*java.*|.*docker.*|.*node.*"
tasks:
- name: "Check processes on destination"
ignore_errors: yes
command: ps auxwww
register: ps_out
- set_fact:
processdump: "{{ ps_out.stdout | regex_findall(grepelement) }}"
- set_fact:
processdumpcount: "{{ processdump | length }}"
- debug: msg="{{ processdumpcount }}"
以上剧本将导致:
PLAY [Sample playbook] **********************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************
ok: [localhost]
TASK [Check processes on destination] *******************************************************************************************************************************
changed: [localhost]
TASK [set_fact] *****************************************************************************************************************************************************
ok: [localhost]
TASK [set_fact] *****************************************************************************************************************************************************
ok: [localhost]
TASK [debug] ********************************************************************************************************************************************************
ok: [localhost] => {
"msg": "3"
}
PLAY RECAP **********************************************************************************************************************************************************
localhost : ok=5 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0