You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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权限的操作来实现,具体调整方式如下:

  1. 修改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 }}'"
  # 剩余命令保持不变...
  1. 关键注意事项
  • 确保普通用户知晓root密码,或者该用户已在/etc/sudoers中配置了无需密码切换root的权限(若使用sudo替代su)。
  • 命令中的引号需正确转义,用单引号包裹nmcli命令,避免空格等特殊字符导致命令解析失败。
  • 测试阶段可先执行简单命令(如su - root -c 'whoami')验证权限切换是否成功,再执行网络配置操作。
  1. 更优替代方案:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:57:08