如何将Ansible的stdout_lines输出存储到字典并提取PID与进程名?
提取进程PID与名称并存储为字典
你可以通过Jinja2模板遍历stdout_lines的每行输出,拆分字符串后构建字典,实现PID与进程信息的映射。
完整Ansible任务示例
- name: Get all running processes shell: cmd: pgrep -a run.sh register: _get_pid_and_name - name: Convert process output to dictionary set_fact: process_dict: >- {% set output_dict = {} %} {% for line in _get_pid_and_name.stdout_lines %} {% set split_line = line.split(maxsplit=1) %} {% do output_dict.update({split_line[0]: split_line[1]}) %} {% endfor %} {{ output_dict }} - name: Print process dictionary debug: var: process_dict
代码说明
stdout_lines:自动将命令输出按行分割为列表,无需手动处理换行符split(maxsplit=1):把每行内容拆分为两部分,第一部分是PID(数字字符串),第二部分是完整的进程命令行- Jinja2循环:遍历每行输出,将PID作为字典的键,进程命令作为对应的值,最终生成字典
预期输出
"process_dict": { "1234223": "/bin/ksh ./run.sh -f -i 1", "4356223": "/bin/ksh ./run.sh -f -i 2", "887455": "/bin/ksh ./run.sh -f -i 3", "9934534": "/bin/ksh ./run.sh -f -i 4", "3245764": "/bin/ksh ./run.sh -f -i 5" }
提取纯进程名称(可选)
如果只需要提取./run.sh这类进程名称而非完整命令,可以调整拆分逻辑:
- name: Convert to dictionary with only process name set_fact: process_name_dict: >- {% set output_dict = {} %} {% for line in _get_pid_and_name.stdout_lines %} {% set split_line = line.split(maxsplit=1) %} {% set pid = split_line[0] %} {% set process_name = split_line[1].split()[1] %} # 提取命令中的第二个字段 {% do output_dict.update({pid: process_name}) %} {% endfor %} {{ output_dict }}
对应的输出会变成:
"process_name_dict": { "1234223": "./run.sh", "4356223": "./run.sh", "887455": "./run.sh", "9934534": "./run.sh", "3245764": "./run.sh" }
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

