如果 virtualenv/venv 位于主目录中,Ansible 错误 python 无法执行?

问题描述 投票:0回答:1

在某些 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)

python ansible virtualenv python-venv
1个回答
0
投票

问题来自于使用

ansible_connection=local
,它更改为使用剧本中相同的 python 解释器来执行,如果在主目录中使用 virtualenv 并在没有访问权限的情况下使用
become_user
,则会失败。

这已经被归档为错误: https://github.com/ansible/ansible/issues/76371

但已按预期关闭并记录在案。

© www.soinside.com 2019 - 2024. All rights reserved.