2020-03-09 10:11:07 +01:00
#!/usr/bin/python
# Copyright: (c) 2019, Saranya Sridharan
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import ( absolute_import , division , print_function )
__metaclass__ = type
DOCUMENTATION = '''
module : pids
description : " Retrieves a list of PIDs of given process name in Ansible controller/controlled machines.Returns an empty list if no process in that name exists. "
short_description : " Retrieves process IDs list if the process is running otherwise return empty list "
author :
- Saranya Sridharan ( @saranyasridharan )
requirements :
- psutil ( python module )
options :
name :
description : the name of the process you want to get PID for .
required : true
type : str
'''
EXAMPLES = '''
# Pass the process name
- name : Getting process IDs of the process
2020-07-13 21:50:31 +02:00
community . general . pids :
2020-03-09 10:11:07 +01:00
name : python
register : pids_of_python
- name : Printing the process IDs obtained
2020-07-14 17:28:08 +02:00
ansible . builtin . debug :
2020-03-09 10:11:07 +01:00
msg : " PIDS of python: {{ pids_of_python.pids|join( ' , ' )}} "
'''
RETURN = '''
pids :
description : Process IDs of the given process
returned : list of none , one , or more process IDs
type : list
sample : [ 100 , 200 ]
'''
from ansible . module_utils . basic import AnsibleModule
try :
import psutil
HAS_PSUTIL = True
except ImportError :
HAS_PSUTIL = False
def compare_lower ( a , b ) :
if a is None or b is None :
# this could just be "return False" but would lead to surprising behavior if both a and b are None
return a == b
return a . lower ( ) == b . lower ( )
def get_pid ( name ) :
pids = [ ]
2021-08-10 08:08:46 +02:00
try :
for proc in psutil . process_iter ( attrs = [ ' name ' , ' cmdline ' ] ) :
if compare_lower ( proc . info [ ' name ' ] , name ) or \
proc . info [ ' cmdline ' ] and compare_lower ( proc . info [ ' cmdline ' ] [ 0 ] , name ) :
pids . append ( proc . pid )
except TypeError : # EL6, EL7: process_iter() takes no arguments (1 given)
for proc in psutil . process_iter ( ) :
try : # EL7
proc_name , proc_cmdline = proc . name ( ) , proc . cmdline ( )
except TypeError : # EL6: 'str' object is not callable
proc_name , proc_cmdline = proc . name , proc . cmdline
if compare_lower ( proc_name , name ) or \
proc_cmdline and compare_lower ( proc_cmdline [ 0 ] , name ) :
pids . append ( proc . pid )
2020-03-09 10:11:07 +01:00
return pids
def main ( ) :
module = AnsibleModule (
argument_spec = dict (
name = dict ( required = True , type = " str " ) ,
) ,
supports_check_mode = True ,
)
if not HAS_PSUTIL :
module . fail_json ( msg = " Missing required ' psutil ' python module. Try installing it with: pip install psutil " )
name = module . params [ " name " ]
response = dict ( pids = get_pid ( name ) )
module . exit_json ( * * response )
if __name__ == ' __main__ ' :
main ( )