理解权限提升:become

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

使用 become

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

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

Become 指令

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

become

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

become_user

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

become_method

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

become_flags

(在 playbook 或任务级别)允许对任务或角色使用特定标志。一个常见用途是在 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作为其初始化系统的 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_systemdsystemd 会话,您可以使用 become_method: machinectl

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

解决临时文件错误消息

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

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

Become 和网络自动化

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

您必须将连接类型设置为 connection: ansible.netcommon.network_cliconnection: ansible.netcommon.httpapi 才能在网络设备上使用 become 进行权限提升。有关详细信息,请查看 平台选项 文档。

您只能在需要提升权限的特定任务、整个剧本或所有剧本上使用提升的权限。添加 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 时,权限已分配给登录令牌,但尚未启用。在大多数情况下,这些权限在需要时会自动启用。

如果在低于 2.5 版本的 Ansible 上运行或正常的 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参数不是必需的,如果指定则会被忽略。

无需设置密码即可提升权限

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

  • 连接用户被分配了SeDebugPrivilege权限

  • 连接用户属于BUILTIN\Administrators

  • become_user拥有SeBatchLogonRightSeNetworkLogonRight用户权限

无需密码使用提升权限有两种不同的方法:

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

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

在第一种情况下,提升权限进程是从该用户帐户的另一个登录中生成的。这可能是现有的 RDP 登录、控制台登录,但这并非始终保证发生。这类似于计划任务的Run only when user is logged on选项。

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

为了区分使用无密码提升权限和提升到没有密码的帐户,请确保将ansible_become_password保持为未定义状态或设置为ansible_become_password:

注意

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

无密码帐户

警告

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

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

在提升权限可以在此类帐户上工作之前,必须禁用本地策略帐户:仅限本地帐户使用空白密码进行控制台登录。这可以通过组策略对象 (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 的提升权限标志

Ansible 2.5 将become_flags参数添加到runas提升权限方法中。可以使用become_flags任务指令设置此参数,或在 Ansible 的配置中使用ansible_become_flags设置。最初支持的此参数的两个有效值为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 在创建新进程时如何登录用户。该值可以设置为无或以下多个值:

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

  • netcredentials_only:该进程将使用与调用者相同的令牌,但在访问远程资源时将使用become_userbecome_password。这在不存在信任关系的跨域场景中很有用,应与new_credentialslogon_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 上提升权限的限制

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

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

  • 在 Ansible 2.3 版本之前,仅当ansible_winrm_transportbasiccredssp时,提升权限才有效。此限制已在 Ansible 2.4 版本中针对所有主机解除,但 Windows Server 2008(非 R2 版本)除外。

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

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

另请参阅

通信

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