ansible 命令模块不保留环境变量

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

Ansible 手册:

 cat sitecode_refresh.yml
---
- name: Run sitecode_refresh.py
  hosts: localhost
  tasks:
    - name: Set pip pat for normal user
      command:  scl enable python27 bash

    - name: Install virtualenv
      pip:
        name: virtualenv
        version: "16.7.10"

    - name: Create virtual environment
      command: virtualenv -p /usr/bin/python2 sitecoderefresh

    - name: Activate virtual environment
      command: source sitecoderefresh/bin/activate

    - name: Install Python requirements
      command: pip install -r requirements.txt

    - name: Run sitecode_refresh.py script
      command: python sitecode_refresh.py --spreadsheet_id="abcxyz" --worksheet_name="Testing"

    - name: Deactivate virtual environment
      command: deactivate
...

运行它会产生如下错误。

ansible-playbook -v -k -K sitecode_refresh.yml
Using /etc/ansible/ansible.cfg as config file
SSH password:
BECOME password[defaults to SSH password]:

PLAY [Run sitecode_refresh.py] *************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [Set pip pat for normal user] *********************************************************************************************************************************************************************************************
changed: [localhost] => {"changed": true, "cmd": ["scl", "enable", "python27", "bash"], "delta": "0:00:00.007686", "end": "2023-08-18 19:38:17.946408", "rc": 0, "start": "2023-08-18 19:38:17.938722", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}

TASK [Install virtualenv] ******************************************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Unable to find any of pip2, pip to use.  pip needs to be installed."}

PLAY RECAP *********************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

当我在 shell 上手动运行时,它工作正常。

如何保留环境设置?

shell ansible-2.x
1个回答
0
投票

您在尝试安装 virtualenv 软件包时似乎遇到了 Ansible playbook 问题。该错误消息表明 Ansible 无法找到用于安装的 pip2 或 pip。

要解决此问题,您可以尝试以下步骤:

指定 Pip 可执行文件:您可以显式指定要在 Playbook 的 pip 模块中使用的 pip 可执行文件。这是一个例子:


- name: Install virtualenv
  pip:
    name: virtualenv
    version: "16.7.10"
    executable: pip2


在本例中,我们使用 pip2 作为可执行文件。调整此项以匹配您系统上适当的可执行文件。

检查 Pip 安装:确保目标计算机上安装了所需版本的 pip。如果未安装,您可能需要手动安装。

环境变量:Ansible 模块在自己的环境中运行,任务内环境变量的更改不会在任务之间持续存在。要为整个剧本设置环境变量,请在剧本级别使用环境关键字。例如:


- name: Run sitecode_refresh.py
  hosts: localhost
  environment:
    PATH: "/path/to/python2/bin:/path/to/pip2/bin:{{ ansible_env.PATH }}"
  tasks:
    # Your tasks here


将 /path/to/python2/bin 和 /path/to/pip2/bin 替换为 Python 2 和 pip 2 安装的实际路径。

用户权限:确保运行 Ansible playbook 的用户拥有执行 playbook 中操作(包括软件包安装)所需的权限。

使用 Ansible 模块:不要使用命令模块来激活虚拟环境和运行命令,而是考虑使用相关的 Ansible 模块来执行这些任务,例如 activate_virtualenv 和 pip 模块。这可以带来更好的集成和环境处理。

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