В Ansible, как используется ключевое слово среды?

У меня есть учебник для установки PythonBrew. Для этого мне нужно изменить среду оболочки. Поскольку шаги оболочки в Ansible не являются постоянными, мне нужно добавить 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

Я бы хотел устранить эту избыточность. На Бесконечная дискуссионная группа, мне было передано ключевое слово environment. Я просмотрел примеры в документации и не нажимал на меня. Для меня ключевое слово environment выглядит не так, как любая другая переменная.

Я искал другие примеры, но смог найти этот очень простой пример.

Может ли кто-нибудь продемонстрировать, как ключевое слово environment работает в Ansible, желательно с образцом кода, который я предоставил выше?

Ответ 1

Не уверен, что это будет соответствовать вашим потребностям, но вот как я это вижу:

- 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 и повторно использует ее как среду в обеих командах оболочки. Таким образом, у вашей команды оболочки будет установлен путь PYTHONBREW_ROOT.

Ответ 2

У меня очень похожая проблема; Я бы хотел, чтобы это было возможно сделать внутри виртуального виртуального Python (после того, как он удостоверился, что он настроен для меня, конечно).

Здесь один из способов я сделал предварительные условия среды до сих пор; по существу мне пришлось добавить (и, возможно, удалить) строки в .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

Я не знаю, "Я делаю это неправильно", но пока не выясню это, или кто-то приходит, чтобы рассказать мне, как сделать это лучше, я полагаю, это сработает.