Ansible systemd模块是否支持打印Cgroup的详细信息?
Ansible systemd模块获取Cgroup详细信息问题
Ansible的systemd模块没有直接选项返回包含PID的Cgroup详细信息,该模块返回的ControlGroup字段仅对应cgroup的路径,不会解析其中的进程列表。
解决方案
方法1:直接调用systemctl status提取信息
通过command模块执行systemctl status命令,再用正则提取Cgroup相关的完整内容:
- name: 获取test.service的Cgroup进程信息 command: systemctl status test.service --full register: systemctl_output changed_when: false - name: 提取并打印Cgroup详细信息 debug: msg: "{{ systemctl_output.stdout | regex_findall('Cgroup: .*?(?=\\n\\S|$)', multiline=True, dotall=True) | first }}"
--full参数确保输出完整的进程信息- 正则表达式匹配从
Cgroup:开始到下一个非空白行前的所有内容,精准提取目标段落
方法2:直接读取cgroup文件并关联进程名
通过systemd模块获取cgroup路径后,读取cgroup下的PID文件,再通过ps命令获取进程名:
- name: 获取test.service的cgroup路径 systemd: name: test.service register: service_status - name: 读取cgroup下的PID列表 command: cat "{{ service_status.status.ControlGroup }}/cgroup.procs" register: cgroup_pids changed_when: false - name: 获取每个PID对应的进程名 command: ps -p {{ item }} -o comm= loop: "{{ cgroup_pids.stdout_lines }}" register: process_names changed_when: false - name: 组装并打印Cgroup详细信息 debug: msg: | Cgroup: {{ service_status.status.ControlGroup }} {% for proc in process_names.results %} {{ proc.item }} {{ proc.stdout }} {% endfor %}
- 该方法不依赖
systemctl status的输出格式,兼容性更强,但需要多步操作获取进程名
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

