理解权限提升:become
Ansible 使用现有的权限提升系统以 root 权限或其他用户的权限执行任务。由于此功能允许您“成为”另一个用户,与登录到机器的用户(远程用户)不同,因此我们将其称为 become
。 become
关键字使用现有的权限提升工具,如 sudo、su、pfexec、doas、pbrun、dzdo、ksu、runas、machinectl 等。
使用 become
您可以使用剧本或任务指令、连接变量或命令行控制 become
的使用。如果您以多种方式设置权限提升属性,请查看 通用优先级规则 以了解将使用哪些设置。
可以在 插件列表 中找到 Ansible 中包含的所有 become 插件的完整列表。
Become 指令
您可以在剧本或任务级别设置控制 become
的指令。您可以通过设置连接变量来覆盖这些指令,连接变量通常在主机之间有所不同。这些变量和指令是独立的。例如,设置 become_user
不会设置 become
。
- become
设置为
true
以激活权限提升。- become_user
设置为具有所需权限的用户 - 您要 become 的用户,而不是您登录的用户。不暗示
become: true
,允许它在主机级别设置。默认值为root
。- become_method
(在剧本或任务级别)覆盖在
ansible.cfg
中设置的默认方法,设置为使用任何 Become 插件。- become_flags
(在剧本或任务级别)允许为任务或角色使用特定标志。一个常见用途是在 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
的剧本,并且剧本似乎挂起,很可能是它卡在了权限提升提示符上。使用 CTRL-c 停止它,然后使用 -K
和适当的密码执行剧本。
Become 连接变量
您可以为每个受管理的节点或组定义不同的 become
选项。您可以在清单中定义这些变量,或者像普通变量一样使用它们。
- ansible_become
覆盖
become
指令并决定是否使用权限提升。- ansible_become_method
应该使用哪种权限提升方法
- ansible_become_user
设置您通过权限提升成为的用户;不暗示
ansible_become: true
- ansible_become_password
设置权限提升密码。有关如何避免在纯文本中使用密钥的详细信息,请参见 使用加密变量和文件。
- ansible_common_remote_group
确定如果
setfacl
和chown
都失败,Ansible 是否应尝试将临时文件chgrp
到组。有关更多信息,请参见 成为非特权用户的风险。在版本 2.10 中添加。
例如,如果您想在名为 webserver
的服务器上以 root
身份运行所有任务,但您只能以 manager
用户身份连接,您可以使用类似于此的清单条目
webserver ansible_user=manager ansible_become=true
注意
上面定义的变量对于所有 become 插件都是通用的,但也可以设置特定于插件的变量。请参阅每个插件的文档以了解插件拥有的所有选项以及如何定义它们。可以在 Become 插件 中找到 Ansible 中的 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_group
已设置但 chgrp(或后面的组权限 chmod)返回非成功的退出代码,Ansible 最后将检查 world_readable_temp 选项。如果已设置此选项,Ansible 将在世界可读的临时目录中放置模块文件,并使用世界可读权限,以允许 become_user
(以及系统上的任何其他用户)读取文件内容。**如果传递给模块的任何参数本质上是敏感的,并且你不信任远程机器,那么这可能是一个潜在的安全风险。**
模块执行完毕后,Ansible 会删除临时文件。
存在多种方法可以完全避免上述逻辑流程
使用 管道。当启用管道时,Ansible 不会将模块保存到客户端上的临时文件。而是将模块管道传输到远程 Python 解释器的 stdin。管道不适用于涉及文件传输的 Python 模块(例如:copy、fetch、template),也不适用于非 Python 模块。
避免成为非特权用户。当您使用
become
root 或不使用become
时,临时文件受 UNIX 文件权限保护。在 Ansible 2.1 及更高版本中,如果您以 root 用户身份连接到受管机器,然后使用become
访问非特权帐户,则 UNIX 文件权限也是安全的。
警告
虽然 Solaris ZFS 文件系统具有文件系统 ACL,但 ACL 不是 POSIX.1e 文件系统 ACL(而是 NFSv4 ACL)。Ansible 无法使用这些 ACL 管理其临时文件权限,因此您可能需要使用 world_readable_temp 选项,如果远程机器使用 ZFS。
版本 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_user
和 become_user
都是非特权用户时使用。有关此回退发生时间的详细信息,请参阅上面的文本。
警告
如上所述,如果 ansible_common_remote_group
和 world_readable_temp
都已启用,则世界可读回退不太可能触发,但 Ansible 仍然可能无法访问模块文件。这是因为组所有权更改成功后,Ansible 不会再进行回退,也不会进行任何检查以确保 become_user
实际上是“公共组”的成员。这是由这样一个设计决定造成的:进行此类检查需要对远程机器进行另一次往返连接,这是一种时间开销大的操作。但是,Ansible 在这种情况下会发出警告。
并非所有连接插件都支持
权限提升方法也必须由所使用的连接插件支持。大多数连接插件在不支持 become 时会发出警告。有些插件会直接忽略它,因为它们始终以 root 身份运行(jail、chroot 等)。
每个主机只能启用一种方法
方法不能链接。您不能使用 sudo /bin/su -
成为用户,您需要有权限在 sudo 中以该用户身份运行命令,或者能够直接 su 到该用户(pbrun、pfexec 或其他支持的方法也是如此)。
权限提升必须是通用的
您不能将权限提升权限限制在某些命令上。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
软件包,但请检查您的操作系统文档。)
成为和网络自动化
从 2.6 版开始,Ansible 支持对所有支持 enable
模式的 Ansible 维护的网络平台使用 become
进行特权升级(进入 enable
模式或特权 EXEC 模式)。使用 become
替换了 provider
字典中的 authorize
和 auth_pass
选项。
您必须将连接类型设置为 connection: ansible.netcommon.network_cli
或 connection: ansible.netcommon.httpapi
,才能在网络设备上使用 become
进行特权升级。有关详细信息,请查看 平台选项 文档。
您只能在需要特权的特定任务、整个剧本或所有剧本上使用升级后的特权。添加 become: true
和 become_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。
Become 和 Windows
从 Ansible 2.3 开始,become
可以通过 runas
方法在 Windows 主机上使用。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
,它对操作系统拥有完全控制权。在 WinRM 上,将
SeTcbPrivilege
授予 Ansible 连接的用户。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 上使用本地或域用户帐户才能正常工作。在这些旧版本中,不能将 System
或 NetworkService
等本地服务帐户用作 become_user
。此限制已在 Ansible 2.5 版本发布后被取消。可以在 become_user
下设置的三个服务帐户是
System
NetworkService
LocalService
由于本地服务帐户没有密码,因此不需要 ansible_become_password
参数,如果指定,它将被忽略。
无需设置密码的 become
从 Ansible 2.8 开始,become
可用于成为 Windows 本地或域帐户,而无需为该帐户提供密码。要使此方法起作用,必须满足以下要求
连接用户已分配
SeDebugPrivilege
权限连接用户是
BUILTIN\Administrators
组的一部分become_user
拥有SeBatchLogonRight
或SeNetworkLogonRight
用户权限
使用无需密码的 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 标志
Ansible 2.5 向 runas
become 方法添加了 become_flags
参数。可以使用 become_flags
任务指令设置此参数,也可以在 Ansible 的配置中使用 ansible_become_flags
设置此参数。此参数最初支持的两个有效值为 logon_type
和 logon_flags
。
注意
仅在成为普通用户帐户时才应设置这些标志,而不是像 LocalSystem 这样的本地服务帐户。
键 logon_type
设置要执行的登录操作类型。该值可以设置为以下值之一
interactive
:默认登录类型。该进程将在与本地运行进程时相同的上下文中运行。这将绕过所有 WinRM 限制,并且是推荐使用的使用方法。batch
:在类似于具有密码的计划任务的批处理上下文中运行进程。如果不允许become_user
交互式登录,这将绕过大多数 WinRM 限制,并且很有用。new_credentials
:在与调用用户相同的凭据下运行,但出站连接将在become_user
和become_password
的上下文中运行,类似于runas.exe /netonly
。还应将logon_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_user
和become_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 上使用
async
和become
运行任务,仅在使用 Ansible 2.7 或更高版本时才有效。默认情况下,become 用户使用交互式会话登录,因此它必须在 Windows 主机上具有执行此操作的权限。如果它没有继承
SeAllowLogOnLocally
权限,或者继承了SeDenyLogOnLocally
权限,则 become 进程将失败。添加此权限或设置logon_type
标志以更改所使用的登录类型。在 Ansible 2.3 版本之前,仅当
ansible_winrm_transport
为basic
或credssp
时,become 才能正常工作。自 Ansible 2.4 版本发布以来,除 Windows Server 2008(非 R2 版本)之外的所有主机都取消了此限制。必须运行辅助登录服务
seclogon
,才能使用ansible_become_method: runas
连接用户必须已经是 Windows 主机上的管理员,才能使用
runas
。目标 become 用户无需是管理员。
另请参阅
- 通信
有问题?需要帮助?想分享你的想法?访问 Ansible 通信指南