Search code examples
ansiblepythonbrew

Using Ansible, how can I install PythonBrew system-wide?


I'm trying to create a playbook with Ansible (v 1.3.3) to install Pythonbrew system-wide on a Debian server following the instructions in the Pythonbrew readme file.

I am able to get Pythonbrew installed but I cannot install the specific version of Python that I want with it. I suspect the issue has to do with the shell environment Ansible is running under.

Here's my playbook script:

- name: Install and configure PythonBrew
  hosts: dev
  user: root
  vars_files:
    - vars.yml
  gather_facts: false

  tasks:
    - name: Install PythonBrew Debian packages
      apt: pkg=${item} state=installed update-cache=yes
      with_items: ${pythonbrew_packages}

    - name: Install PythonBrew system-wide
      shell: curl -kL http://xrl.us/pythonbrewinstall | bash creates=/usr/local/pythonbrew executable=/bin/bash

    - name: Update bashrc for PythonBrew
      lineinfile:
        dest=~/.bashrc
        regexp='^'
        line='[[ -s $HOME/.pythonbrew/etc/bashrc ]] && source $HOME/.pythonbrew/etc/bashrc'
        state=present
        create=True

    - name: Install python binary
      shell: pythonbrew install -v ${python_version} executable=/bin/bash

When I run this playbook, it fails with the following output

failed: [devserver] => {"changed": true, "cmd": "pythonbrew install -v 2.7.3 ", "delta": "0:00:00.016639", "end": "2013-10-11 15:21:40.989677", "rc": 127, "start": "2013-10-11 15:21:40.973038"} stderr: /bin/bash: pythonbrew: command not found

I've been tweaking things for the last hour or so to no avail. Does anybody have any suggestions for fixing this?


Solution

  • By peeking at the PythonBrew install script, I was able to figure this out. (And just in time for the deprecation of PythonBrew!)

    Here's the playbook that installs PythonBrew without manual intervention. This may be of interest to anyone trying to script PythonBrew to install automatically.

    vars.yml

    #
    # Python/PythonBrew Settings
    # TODO: replace old-style Ansible ${vars} with jinja-style {{ vars }}
    #
    project_name: MY_PROJECT
    
    python:
      version: 2.7.3
    
    pythonbrew:
      root: /usr/local/pythonbrew
      bashrc_path: $HOME/.pythonbrew/etc/bashrc
    
      packages:
        - curl
        - zlib1g-dev
        - libsqlite3-dev
        - libssl-dev
        - libxml2
        - libxml2-dev
        - libxslt1-dev
        - libmysqlclient-dev
        - libbz2-dev
    

    pythonbrew.yml

    ---
    
    #
    # Install and Configure PythonBrew
    #
    - name: Install and configure PythonBrew
      hosts: MY_HOST
      user: root
      vars_files:
        - vars.yml
      gather_facts: false
    
      tasks:
        - name: Install PythonBrew Debian packages
          apt: pkg=${item} state=installed update-cache=yes
          with_items: ${pythonbrew.packages}
    
        - name: Install PythonBrew system-wide
          shell: curl -kL http://xrl.us/pythonbrewinstall | bash
            executable=/bin/bash
            creates=${pythonbrew.root}
    
        - name: Update bashrc for PythonBrew
          lineinfile:
            dest=/root/.bashrc
            regexp='^'
            line='[[ -s ${pythonbrew.bashrc_path} ]] && source ${pythonbrew.bashrc_path}'
            state=present
            create=True
    
        # This step allows install to continue without new shell. Pulled from:
        # https://github.com/utahta/pythonbrew/blob/master/pythonbrew/installer/pythonbrewinstaller.py#L91
        - 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