使用Ansible修改CPU Scaling Governor后重启检查结果异常求助
问题描述
使用Ansible修改CPU Scaling Governor并重启主机后,执行以下Playbook检查设置是否生效:
tasks: - name: check scaling governor after reboot vars: scale_gov: "{{ lookup('file', '/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor') }}" governor: schedutil ansible.builtin.debug: var: scale_gov when: governor != scale_gov
执行结果始终显示:
TASK [check scaling governor after reboot] ******************* ok: [host] => { "scale_gov": "powersave" }
但通过SSH登录主机执行cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor,输出的是之前设置的正确Governor值。疑问:操作有误还是file lookup插件存在bug?
问题原因及解决办法
- 核心问题:
lookup('file')是在**控制节点(运行Ansible的本地机器)**上执行的,不是在目标主机上!你读取的是控制节点本地的/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor文件内容,自然和目标主机实际值不符,这不是插件bug,是对Ansible执行逻辑的误解。 - 正确做法:要读取目标主机上的文件,需使用在目标节点执行的模块,以下两种方案可选:
方案1:用command模块读取
tasks: - name: get current scaling governor ansible.builtin.command: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor register: scale_gov_result changed_when: false - name: alert if governor mismatch ansible.builtin.debug: msg: "当前Governor为{{ scale_gov_result.stdout }},预期为schedutil" when: scale_gov_result.stdout != 'schedutil'
方案2:用slurp模块读取
适合读取二进制文件或需要保留原始格式的场景,读取文本文件也适用:
tasks: - name: get current scaling governor ansible.builtin.slurp: src: /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor register: scale_gov_slurp - name: alert if governor mismatch ansible.builtin.debug: msg: "当前Governor为{{ scale_gov_slurp.content | b64decode | trim }},预期为schedutil" when: (scale_gov_slurp.content | b64decode | trim) != 'schedutil'
补充:Ansible的lookup系列插件均在控制节点执行,只有各类模块(如command、slurp、copy等)才会在目标主机上完成操作,这是Ansible的基础执行逻辑。
内容的提问来源于stack exchange,提问作者l487804
相关产品推荐
相关产品推荐

