身份验证或权限失败,没有远程目录的权限。

20

我正在使用ansijet自动化执行ansible playbook,以便在单击按钮时运行该playbook。该playbook用于停止AWS上正在运行的实例。如果从命令行手动运行,则playbook可以正常运行并执行任务。但是,当通过ansijet的Web界面运行时,会遇到以下错误

Authentication or permission failure.  In some cases, you may have been able to authenticate and did not have permissions on the remote directory. Consider changing the remote temp path in ansible.cfg to a path rooted in "/tmp". Failed command was: mkdir -p $HOME/.ansible/tmp/ansible-tmp-1390414200.76-192986604554742 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1390414200.76-192986604554742 && echo $HOME/.ansible/tmp/ansible-tmp-1390414200.76-192986604554742, exited with result 1:

以下是 ansible.cfg 配置文件。

# some basic default values...

inventory      = /etc/ansible/hosts
#library        = /usr/share/my_modules/
remote_tmp     = $HOME/.ansible/tmp/
pattern        = *
forks          = 5
poll_interval  = 15
sudo_user      = root
#ask_sudo_pass = True
#ask_pass      = True
transport      = smart
#remote_port    = 22
module_lang    = C
我尝试将remote_tmp路径更改为/home/ubuntu/.ansible/tmp,但是仍然出现相同的错误。
8个回答

19

默认情况下,用户Ansible连接到远程服务器时将使用与ansible运行的用户名称相同的用户名。在Ansijet的情况下,它将尝试使用启动Ansijet的node.js进程的任何用户连接到远程服务器。你可以在playbook中或全局在ansible.cfg文件中指定remote_user以覆盖这个默认值。

如果该用户没有主目录或其主目录权限不允许写入访问,则Ansible将尝试创建临时目录,但可能无法成功。

实际上,我在我的ansible.cfg文件中更改了临时目录并指向/tmp中的一个位置,这可以解决这些问题。

remote_tmp = /tmp/.ansible-${USER}/tmp


ansijet正在作为ubuntu用户运行。我已经按照您的建议更改了“remote_user”和“remote_tmp”路径。但仍然遇到相同的错误。 - Ajeet Khan
在编辑ansible.cfg的remote_tmp配置后,错误是否完全相同,还是消息发生了变化? - Dave Snigier
有两个playbook,一个是启动实例,另一个是停止实例。现在根据您的建议进行更改后,启动实例的playbook运行良好,但是停止实例的playbook仍然出现相同的错误。 - Ajeet Khan
查看playbook之间不同的选项。将其简化到最基本的内容,然后开始添加角色和选项直到出现问题。 - Dave Snigier
1
如何为Windows 10提供远程临时路径? - Malinda Peiris
显示剩余3条评论

1
我之前遇到了同样的问题,并且像这样解决了。可能的情况是远程服务器的/tmp目录没有足够的写入权限。运行ls -ld /tmp命令以确保其输出看起来像这样: drwxrwxrwt 7 root root 20480 Feb 4 14:18 /tmp 我有root用户作为超级用户,/tmp具有1777权限。
对我而言,简单地将remote_tmp = /tmp设置为工作良好。
另一个检查是确保您正在尝试运行的shell中存在$HOME。Ansible通过/bin/sh shell而不是/bin/bash运行命令。确保$HOME在sh shell中存在。

1
在Linux系统中,/tmp具有特殊权限(粘着位),它不仅仅是777,否则会对使用/tmp的某些应用程序构成安全漏洞。仅使用/tmp会导致如果其他用户运行playbooks,则会出现权限错误。 - Dave Snigier
是的,你说得对。 /tmp 应该设置为粘性位。我的也已经设置了,所以权限应该是 1777 而不是 0777。已在上面的答案中进行更正。感谢你指出这一点。 - Ankit Kulkarni
从未同时运行两个用户的playbook。但是,是的,这可能是一个可能的情况,并且如果两个不同的用户同时使用它,可能会出现问题。 - Ankit Kulkarni

0

检查远程/客户端计算机上的Ansible用户,因为当远程/客户端计算机上的Ansible用户密码过期时会发生此错误。

==========
'WARNING: Your password has expired.\nPassword change required but no TTY available.\n')
<*.*.*.*> Failed to connect to the host via ssh: WARNING: Your password has expired.
Password change required but no TTY available.

Actual error : 

host_name | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to create temporary directory.In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in \"/tmp\", for more error information use -vvv. Failed command was: ( umask 77 && mkdir -p \"` echo /tmp/ansible-$USER `\"&& mkdir /tmp/ansible-$USER/ansible-tmp-1655256382.78-15189-162690599720687 && echo ansible-tmp-1655256382.78-15189-162690599720687=\"` echo /tmp/ansible-$USER/ansible-tmp-1655256382.78-15189-162690599720687 `\" ), exited with result 1",
    "unreachable": true
===========

0
对我来说,用户的默认密码已过期,我必须更改它。通过在我运行的命令中添加-vvv,我能够看到这是问题所在。

0
如果您使用docker作为驱动程序,容器应该:
  1. 存在
  2. 按照清单中所述的名称命名
  3. 处于运行状态
当您执行playbook时。

0
在我的情况下,我需要第一次登录服务器并更改默认密码。

0

这可能主要是因为远程服务器上没有该用户的主目录。

以下步骤解决了我的问题 -

  1. 登录到远程服务器

  2. 切换到root用户

  3. 如果用户是linux_user,并且从哪个主机(在我的情况下是Ansible)尝试连接,则运行以下命令

    mkdir /home/linux_user

    chown linux_user:linux_user /home/linux_user


0
在我的情况下,我意识到我通过SSH连接到了droplet,无意中触发了这个错误。连接后,我被提示输入当前的root密码来更改root密码,但我不知道它是什么。我断开了连接,没有在意这件事。

$ ssh -i ~/.ssh/digitalocean root@67.205.165.127
You are required to change your password immediately (administrator enforced).
You are required to change your password immediately (administrator enforced).
Welcome to Ubuntu 23.10 (GNU/Linux 6.5.0-10-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Wed Nov  8 00:20:41 UTC 2023

  System load:  0.82              Processes:             96
  Usage of /:   8.5% of 23.17GB   Users logged in:       0
  Memory usage: 21%               IPv4 address for eth0: 67.205.165.127
  Swap usage:   0%                IPv4 address for eth0: 10.10.0.5

2 updates can be applied immediately.
To see these additional updates run: apt list --upgradable


Last login: Wed Nov  8 00:06:19 2023 from 98.118.8.22
Changing password for root.
Current password:

然后出现了错误-
Authentication or permission failure.  In some cases, you may have been able to authenticate and did not have permissions on the remote directory. Consider changing the remote temp path in ansible.cfg to a path rooted in "/tmp". Failed command was: mkdir -p $HOME/.ansible/tmp/ansible-tmp-1390414200.76-192986604554742 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1390414200.76-192986604554742 && echo $HOME/.ansible/tmp/ansible-tmp-1390414200.76-192986604554742, exited with result 1:

修复方法: 通过在DigitalOcean用户界面中重置Droplet主机的root密码来解决问题。DigitalOcean向我发送了一个临时密码,我使用该密码通过SSH登录并进行了“必要”的密码更改。这解决了错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接