使用Ansible的vmware_vm_shell模块时,非root用户如何切换su执行命令?
问题描述
我有一个可用的Ansible playbook,它使用vmware_vm_shell模块向VMware中运行的Linux虚拟机推送网络配置命令,但只有当vm_username设置为*'root'*时才能正常工作。我希望使用root以外的普通用户,通过切换到su来执行需要root权限的网络配置CLI命令。
原Playbook内容如下:
- name: Edit Network Interfaces for VM vmware_vm_shell: hostname: "{{ vcenter_hostname }}" username: "{{ vcenter_username }}" password: "{{ vcenter_password }}" validate_certs: "{{ vcenter_validate_certs }}" datacenter: "{{ vcenter_datacenter }}" folder: "{{ vcenter_destination_folder }}" vm_id: VM-Test vm_username: root vm_password: "{{ vm-password }}" vm_shell: "/bin/nmcli" vm_shell_args: "{{ item }}" with_items: - "con mod ens192 ipv4.address '{{ vmintip }}'" - "con mod ens192 ipv4.gateway '{{ intup }}'" - "con mod ens192 ipv4.dns '{{ dnsip }}'" - "con mod ens192 ipv4.method manual" - "con mod ens192 ipv6.method disabled" - "con up ens192" - "con mod 'Wired connection 1' ipv4.address '{{ vmmgip}}'" - "con mod 'Wired connection 1' ipv4.gateway '{{ mgup }}'" - "con mod 'Wired connection 1' ipv4.dns '{{ dnsip }}'" - "con mod 'Wired connection 1' ipv4.method manual" - "con mod 'Wired connection 1' ipv6.method disabled" - "con up 'Wired connection 1'"
当使用普通用户时操作失败,因为这些命令需要root权限,请问使用vmware_vm_shell模块时,能否通过非root用户切换为su来执行命令?
解决方案
可以通过su命令包装需要root权限的操作来实现,具体调整方式如下:
- 修改Playbook的命令执行参数
将vm_shell设置为/bin/su,把原来的nmcli命令作为su的参数传递,指定切换到root用户并通过-c参数执行具体命令。调整后的Playbook片段示例:
- name: Edit Network Interfaces for VM vmware_vm_shell: hostname: "{{ vcenter_hostname }}" username: "{{ vcenter_username }}" password: "{{ vcenter_password }}" validate_certs: "{{ vcenter_validate_certs }}" datacenter: "{{ vcenter_datacenter }}" folder: "{{ vcenter_destination_folder }}" vm_id: VM-Test vm_username: your_non_root_user # 替换为实际普通用户名 vm_password: "{{ vm_non_root_password }}" # 替换为普通用户密码 vm_shell: "/bin/su" vm_shell_args: "- root -c '/bin/nmcli {{ item }}'" with_items: - "con mod ens192 ipv4.address '{{ vmintip }}'" - "con mod ens192 ipv4.gateway '{{ intup }}'" # 剩余命令保持不变...
- 关键注意事项
- 确保普通用户知晓root密码,或者该用户已在
/etc/sudoers中配置了无需密码切换root的权限(若使用sudo替代su)。 - 命令中的引号需正确转义,用单引号包裹
nmcli命令,避免空格等特殊字符导致命令解析失败。 - 测试阶段可先执行简单命令(如
su - root -c 'whoami')验证权限切换是否成功,再执行网络配置操作。
- 更优替代方案:使用sudo
若环境允许,优先使用sudo而非su,因为可通过sudoers细粒度控制用户权限,无需共享root密码。调整方式如下:
vm_shell: "/usr/bin/sudo" vm_shell_args: "-n /bin/nmcli {{ item }}"
前提是普通用户已被授权无需密码执行nmcli命令,需在sudoers中添加类似配置:
your_non_root_user ALL=(ALL) NOPASSWD: /bin/nmcli
内容的提问来源于stack exchange,提问作者Nurra
相关产品推荐
相关产品推荐

