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
将得到正确遵守。
我正在使用 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
.
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
将得到正确遵守。