问题描述

在使用Ansible时,可能会遇到“This command has to be run under the root user”错误,这通常是因为某些模块(如ansible.builtin.package)需要以更高权限(如root用户)执行。这种错误通常与Ansible Playbook的配置或目标主机的权限设置有关。

错误复现

以下是一个Ansible Playbook示例,用于复现该错误:

文件:under_root_user_error.yml

---
- name: troubleshooting under the root user
  hosts: all
  become: false  # 禁用了特权提升
  tasks:
    - name: rsync installed
      ansible.builtin.package:
        name: rsync
        state: present

错误执行

运行Playbook时,可能会出现以下错误:

$ ansible-playbook -i inventory troubleshooting/under_root_user_error.yml
PLAY [troubleshooting under the root user] ******************************************

TASK [Gathering Facts] ************************************************************
ok: [demo.example.com]

TASK [rsync installed] ************************************************************
fatal: [demo.example.com]: FAILED! => {"changed": false, "msg": "This command has to be run under the root user.", "results": []}

PLAY RECAP ***********************************************************************
demo.example.com           : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

错误原因

  1. 特权不足:某些模块(如package)需要以root用户权限执行,而当前用户没有足够的权限。
  2. become未启用:Playbook中未启用become,导致任务无法以更高权限执行。

解决方案

启用become,以便任务以root用户权限执行。修改Playbook如下:

文件:under_root_user_fix.yml

---
- name: troubleshooting under the root user
  hosts: all
  become: true  # 启用特权提升
  tasks:
    - name: rsync installed
      ansible.builtin.package:
        name: rsync
        state: present

修复执行

运行修复后的Playbook:

$ ansible-playbook -i inventory troubleshooting/under_root_user_fix.yml
PLAY [troubleshooting under the root user] ******************************************

TASK [Gathering Facts] ************************************************************
ok: [demo.example.com]

TASK [rsync installed] ************************************************************
ok: [demo.example.com]

PLAY RECAP ***********************************************************************
demo.example.com           : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

总结

  1. 启用become:在Playbook中启用become: true,确保任务以root用户权限执行。
  2. 检查目标主机权限:确保目标主机允许使用特权提升(如sudo)。
  3. 验证模块需求:某些模块需要更高权限才能执行,确保了解这些模块的权限需求。

通过以上步骤,您可以快速解决“This command has to be run under the root user”错误,并确保Playbook顺利执行。