2013-12-13 14 views
7

Có cách nào tốt hơn để chạy ansible bên trong virtualenv trên các máy từ xa không?Cách tốt nhất để luôn chạy ansible bên trong virtualenv trên máy từ xa?

Cho đến nay cách tôi có thể thấy là sửa đổi tệp .bashrc, theo cách thủ công hoặc với chính bản thân.

Ví dụ:

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

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

    # Optionally, disable this later on 
    - name: "Disable virtualenv in .bashrc" 
     lineinfile: dest=.bashrc 
        line="source {{ PROJECT_HOME }}/venv/bin/activate" 
        state=absent 

TODO: Kiểm tra xem cách nó có thể được thực hiện bằng ssh ủy quyền phím: http://binblog.info/2008/10/20/openssh-going-flexible-with-forced-commands/

Trả lời

3

Đây là một cách để cho phép các virtualenv cho toàn bộ vở kịch; ví dụ này xây dựng virtualenv trong một lần phát, sau đó bắt đầu sử dụng nó tiếp theo.

Không chắc chắn mức độ sạch sẽ, nhưng nó hoạt động. Tôi chỉ đang xây dựng một chút về những gì mikepurvis được đề cập ở đây.

--- 
# 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 wrapper file:

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

đẹp giải pháp - có lẽ là nhiệm vụ "thực" đi sau khi nhiệm vụ đang bảo vệ. Tôi nghĩ rằng phần "pyenv wrapper file" ở cuối có lỗi đánh máy - nên là 'pyvenv' để khớp với các tác vụ Ansible. Ngoài ra, dấu ngoặc kép lồng nhau chưa được thoát trong tập lệnh đó trông hơi lạ, nhưng miễn là nó hoạt động ... – RichVel

Các vấn đề liên quan