理解权限提升:become

Ansible使用现有的权限提升系统以root权限或其他用户的权限执行任务。因为此功能允许您“成为”另一个用户,这不同于登录到机器的用户(远程用户),所以我们称之为becomebecome关键字使用现有的权限提升工具,例如sudosupfexecdoaspbrundzdoksurunasmachinectl等。

使用become

您可以使用play或task指令、连接变量或命令行来控制become的使用。如果您以多种方式设置权限提升属性,请查看通用优先级规则以了解将使用哪些设置。

Ansible中包含的所有become插件的完整列表可以在插件列表中找到。

Become指令

您可以在play或task级别设置控制become的指令。您可以通过设置连接变量来覆盖这些指令,这些变量通常在一个主机到另一个主机之间有所不同。这些变量和指令是独立的。例如,设置become_user不会设置become

become

设置为true以激活权限提升。

become_user

设置为具有所需权限的用户——您become的用户,而不是您登录的用户。不暗示become: true,允许在主机级别设置它。默认值为root

become_method

(在play或task级别)覆盖ansible.cfg中设置的默认方法,设置为使用任何Become插件

become_flags

(在play或task级别)允许对任务或角色使用特定标志。一个常见的用途是在shell设置为nologin时将用户更改为nobody。在Ansible 2.2中添加。

例如,要管理系统服务(需要root权限),当以非root用户连接时,您可以使用become_user的默认值(root

- name: Ensure the httpd service is running
  service:
    name: httpd
    state: started
  become: true

apache用户运行命令

- name: Run a command as the apache user
  command: somecommand
  become: true
  become_user: apache

当shell为nologin时,以nobody用户执行某些操作

- name: Run a command as nobody
  command: somecommand
  become: true
  become_method: su
  become_user: nobody
  become_flags: '-s /bin/sh'

要为sudo指定密码,请使用--ask-become-pass(简写为-K)运行ansible-playbook。如果您运行使用become的playbook,并且playbook似乎挂起了,很可能它卡在了权限提升提示符处。使用CTRL-c停止它,然后使用-K和适当的密码执行playbook。

Become连接变量

您可以为每个受管理节点或组定义不同的become选项。您可以在清单中定义这些变量,或者将它们用作普通变量。

ansible_become

覆盖become指令,并决定是否使用权限提升。

ansible_become_method

应该使用哪种权限提升方法

ansible_become_user

设置您通过权限提升成为的用户;不暗示ansible_become: true

ansible_become_password

设置权限提升密码。有关如何避免在纯文本中使用密钥的详细信息,请参见使用加密变量和文件

ansible_common_remote_group

确定如果setfaclchown都失败,Ansible是否应该尝试将其临时文件chgrp到一个组。有关更多信息,请参见成为非特权用户的风险。在2.10版本中添加。

例如,如果您想在名为webserver的服务器上以root权限运行所有任务,但您只能以manager用户连接,您可以使用如下所示的清单条目

webserver ansible_user=manager ansible_become=true

注意

上面定义的变量对于所有become插件都是通用的,但是也可以设置特定于插件的变量。请参阅每个插件的文档,了解该插件的所有选项以及如何定义它们。Ansible中的所有become插件的完整列表可以在Become插件中找到。

Become命令行选项

--ask-become-pass, -K

询问权限提升密码;不暗示将使用become。请注意,此密码将用于所有主机。

--become, -b

使用become运行操作(不暗示密码)

--become-method=BECOME_METHOD

要使用的权限提升方法(默认为sudo),有效选择:[sudo | su | pbrun | pfexec | doas | dzdo | ksu | runas | machinectl]

--become-user=BECOME_USER

以该用户身份运行操作(默认为root),不暗示--become/-b

become的风险和限制

尽管权限提升大多很直观,但在其工作方式上有一些限制。用户应该注意这些以避免意外。

成为非特权用户的风险

Ansible模块在远程机器上执行,首先将参数替换到模块文件中,然后将文件复制到远程机器,最后在那里执行它。

如果模块文件执行时未使用become,或者become_user 为 root 用户,或者以 root 用户身份连接到远程机器,则一切正常。在这些情况下,Ansible 会创建权限仅允许用户和 root 读取,或仅允许切换到的非特权用户读取的模块文件。

但是,当连接用户和become_user 都是非特权用户时,模块文件将以 Ansible 连接的用户(remote_user)身份写入,但该文件需要 Ansible 设置为become的用户可读。Ansible 如何解决此问题取决于平台。但在 POSIX 系统上,Ansible 通过以下方式解决此问题:

首先,如果setfacl已安装并在远程PATH中可用,并且远程主机的临时目录已挂载具有 POSIX.1e 文件系统 ACL 支持,则 Ansible 将使用 POSIX ACL 与第二个非特权用户共享模块文件。

接下来,如果 POSIX ACL **不可用**或无法运行setfacl,Ansible 将尝试使用chown更改模块文件的属主,前提是系统支持非特权用户执行此操作。

Ansible 2.11 新增功能:此时,Ansible 将尝试使用chmod +a,这是一种在 macOS 上设置文件 ACL 的特定方法。

Ansible 2.10 新增功能:如果以上所有方法都失败,Ansible 将检查配置设置ansible_common_remote_group的值。许多系统允许给定用户将其文件的组所有权更改为该用户所属的组。因此,如果第二个非特权用户(become_user)与 Ansible 连接的用户(remote_user)拥有共同的 UNIX 组,并且ansible_common_remote_group被定义为该组,则 Ansible 可以尝试使用chgrp将模块文件的组所有权更改为该组,从而使其可能对become_user可读。

此时,如果定义了ansible_common_remote_group并尝试了chgrp并且返回成功,Ansible 假设(但重要的是,**不检查**)新的组所有权就足够了,并且不会进一步回退。也就是说,Ansible **不检查**become_user是否实际上与remote_user共享一个组;只要命令成功退出,Ansible 就认为结果成功,并且不会继续检查下面的world_readable_temp

如果未设置ansible_common_remote_group并且上面的chown失败,或者设置了ansible_common_remote_groupchgrp(或后面的组权限chmod)返回非成功的退出代码,Ansible 将最后检查world_readable_temp 选项。如果设置了此选项,Ansible 将模块文件放置在世界可读的临时目录中,并具有世界可读的权限,以允许become_user(顺便说一句,系统上的任何其他用户)读取文件的内容。**如果传递给模块的任何参数本质上是敏感的,并且您不信任远程机器,那么这可能是一个潜在的安全风险。**

模块执行完毕后,Ansible 将删除临时文件。

存在几种方法可以完全避免上述逻辑流程:

  • 使用管道传输。启用管道传输时,Ansible 不会将模块保存到客户端的临时文件。相反,它将模块传递到远程 Python 解释器的标准输入。管道传输不适用于涉及文件传输的 Python 模块(例如:copyfetchtemplate),也不适用于非 Python 模块。

  • 避免成为非特权用户。当您become root 或不使用become时,临时文件受 UNIX 文件权限保护。在 Ansible 2.1 及更高版本中,如果您以 root 用户身份连接到被管理的机器,然后使用become访问非特权帐户,则 UNIX 文件权限也是安全的。

警告

尽管 Solaris ZFS 文件系统具有文件系统 ACL,但 ACL 不是 POSIX.1e 文件系统 ACL(而是 NFSv4 ACL)。Ansible 无法使用这些 ACL 来管理其临时文件的权限,因此如果远程机器使用 ZFS,您可能必须求助于world_readable_temp 选项

2.1 版本中的变更。

Ansible 使得不知不觉地不安全地使用become变得很困难。从 Ansible 2.1 开始,如果 Ansible 无法安全地执行become,则默认为发出错误。如果您无法使用管道传输或 POSIX ACL,必须以非特权用户身份连接,必须使用become以不同的非特权用户身份执行,并确定您的被管理节点足够安全,以使您想要在其上运行的模块可以被世界读取,则可以打开world_readable_temp 选项,这会将此错误更改为警告并允许任务按 2.1 之前的版本运行。

2.10 版本中的变更。

Ansible 2.10 引入了上述ansible_common_remote_group回退。如上所述,如果启用,则在remote_userbecome_user都是非特权用户时使用它。有关此回退何时发生的详细信息,请参阅上面的文本。

警告

如上所述,如果同时启用了ansible_common_remote_groupworld_readable_temp,则世界可读回退不太可能触发,但 Ansible 仍然可能无法访问模块文件。这是因为组所有权更改成功后,Ansible 不会进一步回退,也不会进行任何检查以确保become_user实际上是“公共组”的成员。这是一个设计决策,因为进行此类检查需要与远程机器进行另一轮往返连接,这是一个耗时的操作。但是,Ansible 在这种情况下会发出警告。

并非所有连接插件都支持

权限提升方法也必须由使用的连接插件支持。大多数连接插件如果不支持 become,都会发出警告。有些插件会忽略它,因为它们总是以 root 身份运行(jail、chroot 等)。

每个主机只能启用一种方法

方法不能链接。您不能使用sudo /bin/su -来成为用户,您需要拥有以该用户身份运行命令的权限,或者能够直接su到它(pbrunpfexec或其他支持的方法也是如此)。

权限提升必须是通用的

您不能将权限提升权限限制为某些命令。Ansible 并不总是使用特定命令来执行某些操作,而是从每次都会更改的临时文件名运行模块(代码)。如果您将‘/sbin/service’或‘/bin/chmod’作为允许的命令,这将与 Ansible 失败,因为这些路径与 Ansible 创建以运行模块的临时文件不匹配。如果您有安全规则将您的sudo/pbrun/doas环境限制为仅运行特定命令路径,请从没有此限制的特殊帐户使用 Ansible,或使用 AWX 或Red Hat Ansible Automation Platform来管理对 SSH 凭据的间接访问。

可能无法访问由 pamd_systemd 填充的环境变量

对于大多数使用systemd作为其 init 的 Linux 发行版,become使用的默认方法不会打开新的“会话”,从systemd的角度来看。因为pam_systemd模块不会完全初始化新会话,所以您可能会遇到与通过 ssh 打开的普通会话相比的意外情况:由pam_systemd设置的一些环境变量,最值得注意的是XDG_RUNTIME_DIR,不会为新用户填充,而是被继承或只是清空。

当尝试调用依赖XDG_RUNTIME_DIR来访问总线的systemd命令时,这可能会导致问题。

$ echo $XDG_RUNTIME_DIR

$ systemctl --user status
Failed to connect to bus: Permission denied

要强制become打开一个通过pam_systemd的新systemd会话,可以使用become_method: machinectl

更多信息,请参见此 systemd 问题

解决临时文件错误消息

  • “无法设置 Ansible 在成为非特权用户时需要创建的临时文件的权限”

  • 可以通过安装提供setfacl命令的软件包来解决此错误。(这通常是acl软件包,但请检查您的操作系统文档。)

Become 和网络自动化

从 2.6 版本开始,Ansible 支持become用于在所有支持enable模式的 Ansible 托管网络平台上进行权限提升(进入enable模式或特权 EXEC 模式)。使用become替换provider字典中的authorizeauth_pass选项。

要对网络设备使用become进行权限提升,必须将连接类型设置为connection: ansible.netcommon.network_cliconnection: ansible.netcommon.httpapi。详情请查看平台选项文档。

您可以仅对需要提升权限的特定任务、整个剧本或所有剧本使用提升的权限。添加become: truebecome_method: enable可指示 Ansible 在执行设置了这些参数的任务、剧本或剧本集之前进入enable模式。

如果看到此错误消息,则生成该消息的任务需要enable模式才能成功。

Invalid input (privileged mode required)

要为特定任务设置enable模式,请在任务级别添加become

- name: Gather facts (eos)
  arista.eos.eos_facts:
    gather_subset:
      - "!hardware"
  become: true
  become_method: enable

要为单个剧本中的所有任务设置 enable 模式,请在剧本级别添加become

- hosts: eos-switches
  become: true
  become_method: enable
  tasks:
    - name: Gather facts (eos)
      arista.eos.eos_facts:
        gather_subset:
          - "!hardware"

为所有任务设置 enable 模式

通常,您希望所有剧本中的所有任务都使用特权模式运行,最好使用group_vars来实现。

group_vars/eos.yml

ansible_connection: ansible.netcommon.network_cli
ansible_network_os: arista.eos.eos
ansible_user: myuser
ansible_become: true
ansible_become_method: enable

enable 模式的密码

如果需要密码才能进入enable模式,您可以通过以下两种方式之一指定:

  • 提供--ask-become-pass命令行选项。

  • 设置ansible_become_password连接变量。

警告

提醒一下,切勿以纯文本形式存储密码。有关使用 Ansible Vault 加密密码和其他密钥的信息,请参阅Ansible Vault

authorize 和 auth_pass

对于旧版网络剧本,Ansible 仍然支持使用connection: localenable模式。要使用connection: local进入enable模式,请使用模块选项authorizeauth_pass

- hosts: eos-switches
  ansible_connection: local
  tasks:
    - name: Gather facts (eos)
      eos_facts:
        gather_subset:
          - "!hardware"
      provider:
        authorize: true
        auth_pass: " {{ secret_auth_pass }}"

我们建议您更新您的剧本,以始终如一地使用become用于网络设备的enable模式。authorizeprovider字典的使用将在未来被弃用。详情请查看平台选项文档。

Become 和 Windows

从 Ansible 2.3 开始,可以通过runas方法在 Windows 主机上使用become。Windows 上的 Become 使用与非 Windows 主机上的become相同的清单设置和调用参数,因此设置和变量名称与本文档中定义的相同,除了become_user。由于在 Windows 上become_user没有合理的默认值,因此使用become时需要它。详情请参阅ansible.builtin.runas become 插件

虽然become可用于假定另一个用户的身份,但它在 Windows 主机上还有其他用途。一个重要的用途是绕过在 WinRM 上运行时施加的一些限制,例如受约束的网络委派或访问禁止的系统调用(如 WUA API)。您可以将become与与ansible_user相同的用户一起使用,以绕过这些限制并运行在 WinRM 会话中通常无法访问的命令。

注意

在 Windows 上,您不能使用特权不足的帐户连接并使用 become 来提升您的权限。只有当您的连接帐户已经是目标主机的管理员时,才能使用 become。

管理员权限

Windows 中的许多任务都需要管理员权限才能完成。使用runas become 方法时,Ansible 将尝试使用可用于 become 用户的全部权限来运行模块。如果它未能提升用户令牌,它将在执行期间继续使用受限令牌。

用户必须具有SeDebugPrivilege才能以提升的权限运行 become 进程。默认情况下,此权限分配给管理员。如果调试权限不可用,则 become 进程将以有限的权限和组运行。

要确定 Ansible 能够获取的令牌类型,请运行以下任务:

- name: Check my username
  ansible.windows.win_whoami:
  become: true

输出将类似于以下内容:

ok: [windows] => {
    "account": {
        "account_name": "vagrant-domain",
        "domain_name": "DOMAIN",
        "sid": "S-1-5-21-3088887838-4058132883-1884671576-1105",
        "type": "User"
    },
    "authentication_package": "Kerberos",
    "changed": false,
    "dns_domain_name": "DOMAIN.LOCAL",
    "groups": [
        {
            "account_name": "Administrators",
            "attributes": [
                "Mandatory",
                "Enabled by default",
                "Enabled",
                "Owner"
            ],
            "domain_name": "BUILTIN",
            "sid": "S-1-5-32-544",
            "type": "Alias"
        },
        {
            "account_name": "INTERACTIVE",
            "attributes": [
                "Mandatory",
                "Enabled by default",
                "Enabled"
            ],
            "domain_name": "NT AUTHORITY",
            "sid": "S-1-5-4",
            "type": "WellKnownGroup"
        },
    ],
    "impersonation_level": "SecurityAnonymous",
    "label": {
        "account_name": "High Mandatory Level",
        "domain_name": "Mandatory Label",
        "sid": "S-1-16-12288",
        "type": "Label"
    },
    "login_domain": "DOMAIN",
    "login_time": "2018-11-18T20:35:01.9696884+00:00",
    "logon_id": 114196830,
    "logon_server": "DC01",
    "logon_type": "Interactive",
    "privileges": {
        "SeBackupPrivilege": "disabled",
        "SeChangeNotifyPrivilege": "enabled-by-default",
        "SeCreateGlobalPrivilege": "enabled-by-default",
        "SeCreatePagefilePrivilege": "disabled",
        "SeCreateSymbolicLinkPrivilege": "disabled",
        "SeDebugPrivilege": "enabled",
        "SeDelegateSessionUserImpersonatePrivilege": "disabled",
        "SeImpersonatePrivilege": "enabled-by-default",
        "SeIncreaseBasePriorityPrivilege": "disabled",
        "SeIncreaseQuotaPrivilege": "disabled",
        "SeIncreaseWorkingSetPrivilege": "disabled",
        "SeLoadDriverPrivilege": "disabled",
        "SeManageVolumePrivilege": "disabled",
        "SeProfileSingleProcessPrivilege": "disabled",
        "SeRemoteShutdownPrivilege": "disabled",
        "SeRestorePrivilege": "disabled",
        "SeSecurityPrivilege": "disabled",
        "SeShutdownPrivilege": "disabled",
        "SeSystemEnvironmentPrivilege": "disabled",
        "SeSystemProfilePrivilege": "disabled",
        "SeSystemtimePrivilege": "disabled",
        "SeTakeOwnershipPrivilege": "disabled",
        "SeTimeZonePrivilege": "disabled",
        "SeUndockPrivilege": "disabled"
    },
    "rights": [
        "SeNetworkLogonRight",
        "SeBatchLogonRight",
        "SeInteractiveLogonRight",
        "SeRemoteInteractiveLogonRight"
    ],
    "token_type": "TokenPrimary",
    "upn": "[email protected]",
    "user_flags": []
}

label键下,account_name条目确定用户是否具有管理员权限。以下是可返回的标签及其含义:

  • Medium:Ansible 无法获取提升的令牌,并且在受限令牌下运行。在模块执行期间,只有分配给用户的权限子集可用,并且用户没有管理员权限。

  • High:使用了提升的令牌,并且在模块执行期间可以使用分配给用户的所有权限。

  • System:使用NT AUTHORITY\System帐户,它具有最高的可用权限级别。

输出还将显示已授予用户的权限列表。当权限值为disabled时,该权限已分配给登录令牌,但尚未启用。在大多数情况下,这些权限在需要时会自动启用。

如果在 Ansible 2.5 之前的版本上运行,或者正常的runas提升过程失败,则可以通过以下方式检索提升的令牌:

  • become_user设置为System,它对操作系统具有完全控制权。

  • SeTcbPrivilege授予 Ansible 在 WinRM 上连接的用户。SeTcbPrivilege是一个高级权限,可以对操作系统进行完全控制。默认情况下,不会向任何用户授予此权限,如果您将此权限授予用户或组,则应谨慎操作。有关此权限的更多信息,请参阅充当操作系统的一部分。您可以使用以下任务在 Windows 主机上设置此权限:

    - name: grant the ansible user the SeTcbPrivilege right
      ansible.windows.win_user_right:
        name: SeTcbPrivilege
        users: '{{ansible_user}}'
        action: add
    
  • 在尝试成为用户之前,关闭主机上的 UAC 并重新启动。UAC 是一种安全协议,旨在根据最小权限原则运行帐户。您可以通过运行以下任务来关闭 UAC:

    - name: turn UAC off
      win_regedit:
        path: HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system
        name: EnableLUA
        data: 0
        type: dword
        state: present
      register: uac_result
    
    - name: reboot after disabling UAC
      win_reboot:
      when: uac_result is changed
    

注意

授予SeTcbPrivilege或关闭 UAC 可能会导致 Windows 安全漏洞,因此如果采取这些步骤,应谨慎操作。

本地服务帐户

在 Ansible 2.5 版本之前,become仅适用于具有本地或域用户帐户的 Windows。在这些较旧的版本中,不能将本地服务帐户(如SystemNetworkService)用作become_user。此限制已从 Ansible 2.5 版本开始解除。可以在become_user下设置的三个服务帐户是:

  • System

  • NetworkService

  • LocalService

由于本地服务帐户没有密码,因此不需要ansible_become_password参数,如果指定了该参数,则会忽略它。

无需设置密码即可使用 Become

从 Ansible 2.8 开始,become可用于成为 Windows 本地或域帐户,而无需该帐户的密码。要使此方法有效,必须满足以下要求:

  • 连接用户已分配SeDebugPrivilege权限。

  • 连接用户是BUILTIN\Administrators组的一部分。

  • become_user具有SeBatchLogonRightSeNetworkLogonRight用户权限。

使用无需密码的 become 可通过以下两种不同的方法实现:

  • 如果帐户已登录,则复制现有登录会话的令牌。

  • 使用 S4U 生成仅在远程主机上有效的登录令牌

在第一种情况下,become 进程是由该用户帐户的另一个登录会话启动的。这可能是现有的 RDP 登录、控制台登录,但这并非总是如此。这类似于计划任务的 Run only when user is logged on 选项。

如果become帐户不存在其他登录会话,则使用 S4U 创建一个新的登录会话并通过该会话运行模块。这类似于计划任务的 Run whether user is logged on or not 以及 Do not store password 选项。在这种情况下,become 进程将无法像普通的 WinRM 进程一样访问任何网络资源。

为了区分使用无密码的 become 和成为一个没有密码的帐户,请确保将 ansible_become_password 保持为未定义状态或设置为 ansible_become_password:

注意

由于无法保证 Ansible 运行时用户存在现有令牌,因此 become 进程很可能只能访问本地资源。如果任务需要访问网络资源,请使用带有密码的 become。

无密码帐户

警告

作为一般的安全最佳实践,应避免允许使用无密码帐户。

Ansible 可用于成为没有密码的 Windows 帐户(例如 Guest 帐户)。要成为没有密码的帐户,请像往常一样设置变量,但将 ansible_become_password: ''

在 become 能够在此类帐户上工作之前,必须禁用本地策略 帐户:仅限本地帐户使用空密码进行控制台登录。这可以通过组策略对象 (GPO) 或使用此 Ansible 任务来完成。

- name: allow blank password on become
  ansible.windows.win_regedit:
    path: HKLM:\SYSTEM\CurrentControlSet\Control\Lsa
    name: LimitBlankPasswordUse
    data: 0
    type: dword
    state: present

注意

这仅适用于没有密码的帐户。如果 become_user 有密码,则仍然需要在 ansible_become_password 下设置帐户的密码。

Windows 的 become 标志

此参数最初支持的两个有效值为 logon_typelogon_flags

注意

仅在成为普通用户帐户时才应设置这些标志,而不是像 LocalSystem 这样的本地服务帐户。

logon_type 设置要执行的登录操作的类型。该值可以设置为以下值之一:

  • interactive:默认登录类型。该进程将在与在本地运行进程时相同的上下文中运行。这将绕过所有 WinRM 限制,并且是推荐的方法。

  • batch:在类似于设置了密码的计划任务的批处理上下文中运行该进程。这应该绕过大多数 WinRM 限制,如果 become_user 不允许交互式登录,这将很有用。

  • new_credentials:在与调用用户相同的凭据下运行,但出站连接在 become_userbecome_password 的上下文中运行,类似于 runas.exe /netonlylogon_flags 标志也应设置为 netcredentials_only。如果进程需要使用不同的凭据集访问网络资源(例如 SMB 共享),请使用此标志。

  • network:在没有任何缓存凭据的网络上下文中运行该进程。这将产生与运行没有凭据委派的普通 WinRM 进程相同的登录会话类型,并受相同的限制。

  • network_cleartext:与 network 登录类型类似,但会缓存凭据,以便它可以访问网络资源。这与使用凭据委派的普通 WinRM 进程的登录会话类型相同。

更多信息,请参阅 dwLogonType

logon_flags 键指定在创建新进程时 Windows 将如何登录用户。该值可以设置为 none 或以下值的组合:

  • with_profile:默认的登录标志。该进程将在 HKEY_USERS 注册表键中将用户的配置文件加载到 HKEY_CURRENT_USER

  • netcredentials_only:该进程将使用与调用者相同的令牌,但在访问远程资源时将使用 become_userbecome_password。这在没有信任关系的跨域场景中很有用,应与 new_credentials logon_type 一起使用。

默认情况下,设置 logon_flags=with_profile,如果不需要加载配置文件,则设置为 logon_flags=;如果需要使用 netcredentials_only 加载配置文件,则设置为 logon_flags=with_profile,netcredentials_only

更多信息,请参阅 dwLogonFlags

以下是一些关于如何在 Windows 任务中使用 become_flags 的示例

- name: copy a file from a fileshare with custom credentials
  ansible.windows.win_copy:
    src: \\server\share\data\file.txt
    dest: C:\temp\file.txt
    remote_src: true
  vars:
    ansible_become: true
    ansible_become_method: runas
    ansible_become_user: DOMAIN\user
    ansible_become_password: Password01
    ansible_become_flags: logon_type=new_credentials logon_flags=netcredentials_only

- name: run a command under a batch logon
  ansible.windows.win_whoami:
  become: true
  become_flags: logon_type=batch

- name: run a command and not load the user profile
  ansible.windows.win_whomai:
  become: true
  become_flags: logon_flags=

Windows 上 become 的限制

  • 在 Windows Server 2008、2008 R2 和 Windows 7 上使用 asyncbecome 运行任务仅在使用 Ansible 2.7 或更高版本时才有效。

  • 默认情况下,become 用户使用交互式会话登录,因此必须具有在 Windows 主机上执行此操作的权限。如果它没有继承 SeAllowLogOnLocally 权限或继承了 SeDenyLogOnLocally 权限,则 become 进程将失败。添加权限或设置 logon_type 标志以更改使用的登录类型。

  • 在 Ansible 2.3 版本之前,只有当 ansible_winrm_transportbasiccredssp 时,become 才有效。自 Ansible 2.4 版本起,此限制已解除,但 Windows Server 2008(非 R2 版本)除外。

  • 必须运行辅助登录服务 seclogon 才能使用 ansible_become_method: runas

  • 连接用户必须已经是 Windows 主机上的管理员才能使用 runas。但是,目标 become 用户不需要是管理员。

另请参阅

通讯

有问题?需要帮助?想分享你的想法?请访问 Ansible 通信指南