在某些 Ubuntu 22.04 机器中,我看到以下 Ansible 错误:
TASK [pbalucode.postgresql : Create database] ************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "module_stderr": "/bin/sh: 1: /home/user/installer/ansible/bin/python3.10: Permission denied\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 126}
/home/user/installer 是创建的 virtualenv/venv,其中安装了 Ansible 2.17.3。 奇怪的是,只有当 virtualenv/venv 位于主目录内时才会发生此错误。如果我在 /tmp 或 /opt 中安装 virtualenv/venv,则不会发生此错误。
更奇怪的是,剧本已经做了很多其他事情,但它总是在同一个任务上失败(如果失败的话)。 它不是在 Ubuntu 22.04 docker 映像中失败,而是在所有真实的虚拟机中失败。
Ansible 代码相当可疑:
- name: Create database
ansible.builtin.command: "{{ postgresql_bin_dir }}/initdb \
-D {{ postgresql_pgdata }}"
become: true
become_user: "{{ postgresql_user_name }}"
when: not dbinit.stat.exists
符号链接正常且可执行,我可以很好地手动运行它们,并且许多其他 Ansible 任务也运行良好。
$ ll /home/user/installer/ansible/bin/python3.10
lrwxrwxrwx 1 user user 6 Sep 6 10:06 /home/user/installer/ansible/bin/python3.10 -> python*
$ ll /home/user/installer/ansible/bin/python
lrwxrwxrwx 1 user user 16 Sep 6 10:06 /home/user/installer/ansible/bin/python -> /usr/bin/python3*
$ ll /usr/bin/python3
lrwxrwxrwx 1 root root 10 Aug 8 12:28 /usr/bin/python3 -> python3.10*
$ ll /usr/bin/python3.10
-rwxr-xr-x 1 root root 5904936 Jul 29 16:56 /usr/bin/python3.10*
$ /home/user/installer/ansible/bin/python3.10 --version
Python 3.10.12
知道这里出了什么问题以及如何解决这个问题吗? 感觉像是一个相当严格的限制,以避免在主目录中创建 virtualenv/venv。
很快就有一条评论询问安装选项,它们很简单,这里没有什么特别的:
/dev/mapper/ubuntu--vg-ubuntu--lv on / type ext4 (rw,relatime)
问题来自于使用
ansible_connection=local
,它更改为使用剧本中相同的 python 解释器来执行,如果在主目录中使用 virtualenv 并在没有访问权限的情况下使用 become_user
,则会失败。
这已经被归档为错误: https://github.com/ansible/ansible/issues/76371
但已按预期关闭并记录在案。