我在 Ansible playbook 中遇到了一个问题,该剧本既配置了 Kubernetes 集群,又配置了我们云基础架构内的其他服务器。具体来说,当我在 ansible.cfg 文件中配置“remote_tmp”变量时,就会出现问题。尽管设置了此变量,但 Kubernetes 集群内的容器似乎忽略了它,导致出现以下错误消息:
fatal: [localhost]: 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 /home/user/.ansible/tmp `\"&& mkdir \"` echo /home/user/.ansible/tmp/ansible-tmp-1234567890.1234567-1234-123456789123456 `\" && echo ansible-tmp-1234567890.1234567-1234-123456789123456=\"` echo /home/user/.ansible/tmp/ansible-tmp-1234567890.1234567-1234-123456789123456 `\" ), exited with result 1", "unreachable": true}
有趣的是,当 ansible.cfg 中配置了“remote_tmp”变量时,Kubernetes 集群外部的服务器可以正常运行。但是,集群内的容器无法遵循此配置。在引入核心和社区分裂后将 Ansible 更新到最新版本后出现了此问题(具体来说,我怀疑它可能与 Ansible Community 5 有关,尽管我并不完全确定)。
我还注意到,在主剧本的各个剧本中设置“ansible_remote_tmp”变量可以解决 Kubernetes 集群的问题,如下面的代码片段所示:
- name: example play
tags: [ example ]
hosts: 127.0.0.1
connection: local
vars_files:
- vars/main.yml
vars:
ansible_remote_tmp: /tmp/ansible-remote
这是什么原因造成的?我到处找过了,没看到有人遇到同样的问题。
答案1
在现代 Ansible 中,运行ansible-config list -t shell
以列出特定于 shell 插件的配置定义。在 sh 下,您可以找到几种设置 remote_tmp 的方法。 ansible-config dump -t shell
将列出当前值及其定义的位置。
现在调试为什么该值会失败。从中复制确切的命令并出错。在 Ansible 之外的容器内以交互方式运行它。引用相当可怕,但这就是它如何变成一行并适合一个 ssh 命令的方式。
在这种情况下,它所做的就是在远程临时目录下创建一个唯一的目录,默认情况下在用户的主目录中。使用默认的 sh shell 插件时,低级命令基本上可以在任何 POSIX 系统中工作。但容器不适合用作真实服务器。以交互方式确认:
- 用户主目录存在,并且可以由该用户写入
- mkdir 命令可用
- 如果后续 Ansible 模块使用 python,则需要安装 python
如果您希望更改特定主机的 ansible_remote_tmp,请考虑在组级别进行设置。在 inventory 中使用组级别变量进行设置是有意义的。Inventory 以与主机的连接为导向,而 play 的其他用户可能希望覆盖他们的主机。