質問

これは本当に簡単なべきようなようです:

tasks:
- name: install python packages
  pip: name=${item} virtualenv=~/buildbot-env
  with_items: [ buildbot ]
- name: create buildbot master
  command: buildbot create-master ~/buildbot creates=~/buildbot/buildbot.tac
.

しかし、virtualenvのアクティブ化スクリプトが最初にソースされていない限り、コマンドは成功しません。 Ansibleコマンドモジュール

運動スクリプトを様々な.profile、.bashrc、.bash_loginなどで様々なもので、運のない、運用を実験しました。あるいは、シェルコマンドがありますが、厄介なハックの種類のようです。

- name: create buildbot master
  shell: source ~/buildbot-env/bin/activate && \
         buildbot create-master ~/buildbot \
         creates=~/buildbot/buildbot.tac executable=/bin/bash
.

より良い方法はありますか?

役に立ちましたか?

解決

より良い方法は、インストールされているスクリプトへのフルパスを使用することです - virtualenvが自動的に実行されます。

tasks:
- name: install python packages
  pip: name={{ item }} virtualenv={{ venv }}
  with_items: [ buildbot ]
- name: create buildbot master
  command: "{{ venv }}/bin/buildbot create-master ~/buildbot
            creates=~/buildbot/buildbot.tac"
.

他のヒント

これはラッパーメソッドの一般化されたバージョンです。

VENV_EXEC.J2:

#!/bin/bash
source {{ venv }}/bin/activate
$@
.

とプレイブック:

tasks:
  - pip: name={{ item }} virtualenv={{ venv }}
    with_items:
      - buildbot
  - template: src=venv_exec.j2 dest={{ venv }}/exec mode=755
  - command: "{{ venv }}/exec buildbot create-master {{ buildbot_master }}"
.

これは、Play全体のvirtualenvを有効にする方法です。この例では、virtualenvを1つのプレイに構築してから、次のプレイの使用を開始します。

それがどれほどきれいであるかはうまくいきませんが機能します。私はMikepurvisがここに言及されているのかを少し構築しています。

---
# Build virtualenv
- hosts: all
vars:
  PROJECT_HOME: "/tmp/my_test_home"
  ansible_python_interpreter: "/usr/local/bin/python"
tasks:
  - name: "Create virtualenv"
    shell: virtualenv "{{ PROJECT_HOME }}/venv"
           creates="{{ PROJECT_HOME }}/venv/bin/activate"

  - name: "Copy virtualenv wrapper file"
    synchronize: src=pyvenv
                 dest="{{ PROJECT_HOME }}/venv/bin/pyvenv"

# Use virtualenv
- hosts: all
vars:
  PROJECT_HOME: "/tmp/my_test_home"
  ansible_python_interpreter: "/tmp/my_test_home/venv/bin/pyvenv"
tasks:
  - name: "Guard code, so we are more certain we are in a virtualenv"
    shell: echo $VIRTUAL_ENV
    register: command_result
    failed_when: command_result.stdout == ""
.

Pyenvラッパーファイル:

#!/bin/bash
source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/activate"
python $@
.

シェルでVirtualEnvs PIPを実行するだけです。

shell: ~/buildbot-env/pip install ${item}
.

は魅力のように動作します。PIPモジュールがVirtualEnvsを使用しているのかわかりませんが、かなり無駄になるようです。

上記のコメントとして、私はスクリプトを作成し、それがbuildbot.shと呼ばれます:

source ~/buildbot-env/bin/activate
buildbot create-master [and more stuff]
.

そのようなタスクを使用してリモコンで実行します。

- name: Create buildbot master
  script: buildbot.sh
.

私にとってはまだ不要なようですが、シェルコマンドで実行するよりもクリーナーです。あなたのプレイブックは、スクリプトが何であるかをすぐに見ていないの犠牲を払ってクリーナーに見えます。

少なくとも一部のモジュールは、django_managerax_clbの両方が既にInBuilt VirtualEnvパラメータを持っているため、virtualenvを使用しているようです。Ansibleには、モジュールのモジュールのコマンドを含めることができるような大きなステップではないかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top