Ansible - 使用 become_user 激活虚拟环境

Ansible - Activating virtual env with become_user

我想为我的 CKAN 安装创建一个用户,然后以该用户身份激活虚拟环境并安装一些东西。

- name: Add a CKAN user
  user:
    name: ckan
    comment: "CKAN User"
    shell: /sbin/nologin
    create_home: yes
    home: /usr/lib/ckan
    state: present 

- name: chmod 755 /usr/lib/ckan
  file:
    path: /usr/lib/ckan
    mode: u=rwX,g=rX,o=rX
    recurse: yes

- name: Create Python virtual env
  command: virtualenv --no-site-packages default 
  become: yes
  become_user: ckan

- name: Activate env
  command: . default/bin/activate

- name: Activate env
  command: pip install setuptools==36.1

我知道这通常不是最 'Ansible' 的实现,但我只是想让一些东西起作用。

错误在 'Create Python virtual env'。我在

的该行中收到错误

在命令行中我会 运行: su -s /bin/bash - ckan

但是我该如何实现呢?我以为 become_user 会做?

以下有效:

- name: Install setuptools into venv
  pip:
    name: Setuptools==36.1
    virtualenv: '{{ path_to_virtualenv }}'

不需要成为用户。

另一个例子:

- name:  Install ckan python modules
  pip: name="requirements-docs.txt"  virtualenv={{ ckan_virtualenv }} state=present extra_args="--ignore-installed -r"

如果您已经有了用户文件夹的路径并设置了适当的权限,那么您可以直接使用Ansible pip模块在该文件夹中创建一个虚拟环境并安装包。所以,IIUC 你不需要以下任务

  • Create Python virtual env
    • 您可以将参数 virtualenv_command 添加到 pip 模块来代替此任务以创建虚拟环境(如果它尚不存在)
  • Activate env (x2)
    • 如果您想使用 Ansible pip 模块将软件包安装到虚拟环境中,则不需要执行这 2 个任务

此外,您可以使用参数 virtualenv_site_packages 来排除虚拟环境中的全局包。您不需要使用参数 extra_args 来执行此操作。

如果您想将单个包安装到虚拟环境中,那么您可以用以下任务替换您的最后 3 个任务

tasks:
  - name: Create Python virtual env and install one package inside the virtual env
    pip:
      name: setuptools==36.1
      virtualenv: /path/to/ckan/user/home/folder # <--- path to user's home folder*
      virtualenv_command: virtualenv
      virtualenv_site_packages: no   # <---- added this parameter to exclude site packages
      virtualenv_python: python3.7

如果您想从 requirements-docs.txt 安装 多个软件包 ,那么您可以使用这种方法

tasks:
  - name: Create Python virtual env and install multiple packages inside the virtual env
    pip:
      requirements: /path/to/ckan/user/home/folder/requirements-docs.txt
      virtualenv: /path/to/ckan/user/home/folder # <--- path to user's home folder*
      virtualenv_command: virtualenv
      virtualenv_site_packages: no   # <---- added this parameter to exclude site packages
      virtualenv_python: python3.7

*执行此任务之前用户的主文件夹必须存在