13

我有一本安装 PythonBrew 的剧本。为此,我必须修改 shell 环境。因为 Ansible 中的 shell 步骤不是持久的,所以我必须在export PYTHONBREW_ROOT=${pythonbrew.root}; source ${pythonbrew.root}/etc/bashrc;每个 PythonBrew 相关命令的开头添加:

    - name: Install python binary
      shell: export PYTHONBREW_ROOT=${pythonbrew.root}; source ${pythonbrew.root}/etc/bashrc; pythonbrew install ${python.version}
        executable=/bin/bash

    - name: Switch to python version
      shell: export PYTHONBREW_ROOT=${pythonbrew.root}; source ${pythonbrew.root}/etc/bashrc; pythonbrew switch ${python.version}
        executable=/bin/bash

我想消除这种冗余。在Ansible 讨论组中,我被提到了environment关键字。我查看了文档中的示例,但对我来说并没有点击。对我来说, environment 关键字看起来与任何其他变量都没有太大不同。

我一直在寻找其他示例,但只能找到这个非常简单的示例

有人可以演示environment关键字在 Ansible 中的作用,最好使用我上面提供的代码示例吗?

4

2 回答 2

16

不确定它是否符合您的需要,但这就是我的看法:

- hosts: all
  vars:
    env:
      PYTHONBREW_ROOT: "{{ pythonbrew.root }}"
  tasks:  
    - name: Install python binary
      shell: pythonbrew install {{ python.version }} executable=/bin/bash
      environment: env

    - name: Switch to python version
      shell: pythonbrew switch {{ python.version }} executable=/bin/bash
      environment: env

它只是设置一个名为的变量并将env其重用为两个 shell 命令中的环境。这样,您的 shell 命令将设置 PYTHONBREW_ROOT 路径。

于 2013-12-13T08:25:16.563 回答
0

我有一个非常相似的问题;我想让 ansible 在 Python virtualenv 中做它的东西(当然,在它确保它为我设置之后)。

到目前为止,这是我完成环境先决条件的一种方法;本质上,我不得不向 .bashrc 添加(并且可以选择删除)行:

  tasks:
    - name: "Enable virtualenv in .bashrc"
      lineinfile: dest=.bashrc
                  line="source {{ PROJECT_HOME }}/venv/bin/activate"

    # Put tasks that rely on this environmental precondition here (?)

    - name: "Disable virtualenv in .bashrc"
      lineinfile: dest=.bashrc
                  line="source {{ PROJECT_HOME }}/venv/bin/activate"
                  state=absent

我不知道我是否“做错了”,但在我弄清楚或有人过来告诉我如何做得更好之前,我想这会奏效。

于 2013-12-13T18:59:33.097 回答