Ansible 无法使用不同的用户在本地主机上创建文件夹

Ansible unable to create folder on localhost with different user

我正在使用 appuser 执行 ansible 剧本,而我希望在本地主机上使用用户 webuser 创建文件夹。

在我的本地主机上为 webuser 设置了 ssh 密钥。所以在使用 appuser 登录后,我可以简单地 ssh webuser@localhost 将用户切换到 webuser.

注意:我没有 sudo 权限,所以我无法 sudo 从 appuser 切换到 webuser。

下面是我的剧本 运行 用户 appuser 但需要使用 webuser

在本地主机上创建一个文件夹 04May2020
- name: "Play 1"

  hosts: localhost
  remote_user: "webuser"
  vars:
    ansible_ssh_extra_args: -o StrictHostKeyChecking=no
    ansible_ssh_private_key_file: /app/misc_automation/ssh_keys_id_rsa

  tasks:
   - name: create folder for today's print
     file:
       path: "/webWeb/htdocs/print/04May2020"
       state: directory
     remote_user: webuser

但是,输出显示该文件夹是使用 appuser 而不是 webuser 创建的。请参阅显示使用 appuser 而不是 webuser.

的 ssh 连接的输出
ansible-playbook /app/Ansible/playbook/print_oracle/print.yml -i /app/Ansible/playbook/print_oracle/allhosts.hosts -vvv

TASK [create folder for today] ***********************************
task path: /app/Ansible/playbook/print_oracle/print.yml:33
Using module file /usr/lib/python2.7/site-packages/ansible/modules/files/file.py
Pipelining is enabled.
<127.0.0.1> ESTABLISH LOCAL CONNECTION FOR USER: appuser
<127.0.0.1> EXEC /bin/sh -c '/usr/bin/python2 && sleep 0'

如果没有 sudo 是否可行,您能否提出建议?

您可以尝试的一种方法是将 ansible_connection 设置为本地主机。为此,在您执行 运行 ansible 命令的目录中,创建一个 host_vars 目录。在该子目录中,创建一个名为 localhost 的文件,其中包含行 ansible_connection: smart

将我所有的评论放在一个综合的答案中。

<127.0.0.1> ESTABLISH LOCAL CONNECTION FOR USER: appuser

这表示您正在通过 local connection plugin, either because you explicitelly re-declared the host as such or because you are using the implicit localhost 连接到本地主机。从讨论来看,你属于第二种情况。

当使用 local 连接插件时,如上述文档中所述,remote_user 将被忽略。正如您在下面的测试中看到的那样,尝试更改用户没有任何效果 运行(用户 (u)id 已更改):

# Check we are locally running as user1
$ id -a
uid=xxxx(user1) gid=yyy(group1) groups=yyy(group1)
# Running the same command through ansible returns the same result
$ ansible localhost -a 'id -a'
localhost | CHANGED | rc=0 >>
uid=xxxx(user1) gid=yyy(group1) groups=yyy(group1)
# Trying to change the remote user has no effect
$ ansible localhost -u whatever -a 'id -a'
localhost | CHANGED | rc=0 >>
uid=xxxx(user1) gid=yyy(group1) groups=yyy(group1)

在不更改剧本 and/or 清单的情况下,唯一的解决方案是以需要创建目录的用户身份启动剧本。

既然你有 ssh 可用,另一种解决方案是声明一个你将仅用于此目的的新主机,它将通过 ssh 定位本地 IP。 (注意:您可以像这样显式声明 localhost,但所有连接都将通过 ssh,这可能不是您想要的)。

在清单顶部的某处,添加以下行:

localssh ansible_host=127.0.0.1

在你的剧本中,改变

hosts: localssh

现在将通过 ssh 连接到您的本地计算机,并且 remote_user 将得到正确遵守。