Подтвердить что ты не робот

Можно ли условно подменить переменную?

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

Это не работает. Это всегда подсказывает мне.

vars:
  THISUSER: "{{ lookup('env','LOGNAME') }}"
  SSHPWD:   "{{ lookup('env','MY_PWD') }}"

vars_prompt:
  - name: "release_version"
    prompt: "Product release version"
    default: "1.0"
    when: SSHPWD == null

ПРИМЕЧАНИЕ. Я нахожусь на Mac, но я бы хотел, чтобы любые решения были независимыми от платформы.

4b9b3361

Ответ 1

В соответствии с ответами devs и быстрым тестом, который я сделал с последней версией, vars_prompt запускается до "СБРОС ФАКТОВ". Это означает, что env var SSHPWD всегда null во время вашей проверки с помощью when.

К сожалению, кажется, что нет способа разрешить оператор vars_prompt на уровне задачи.

Майкл ДеХаан рассуждает о том, что разрешение подсказок на уровне задач откроет двери для ролей, задающих много вопросов. Это сделало бы использование роли Ansible Galaxy, которые делают это сложно:

Был решительный акцент в автоматизации в Ansible и задание вопросов на уровне задач - это не то, что мы действительно хотим сделать.

Однако вы все равно можете задавать вопросы vars_prompt на уровне игры и использовать эти переменные во всех задачах. Вы просто не можете задавать вопросы в ролях.

И действительно, это то, что я хотел бы применить - если много ролей Galaxy начинают задавать вопросы, я вижу, что это раздражает:)

Ответ 2

Возможно, я опаздываю на вечеринку, но быстрый способ избежать vars_prompt - отключить interactive mode, выполнив этот простой трюк:

echo -n | ansible-playbook -e MyVar=blih site.yaml

Это не добавляет контроля над тем, какой vars_prompt следует избегать, но в сочетании с default: "my_default" он может использоваться в script.

Полный пример:

---
- hosts: localhost
  vars_prompt:
    - prompt: Enter blah value
    - default: "{{ my_blah }}"
    - name: blah

echo -n | ansible-playbook -e my_blah=blih site.yaml

EDIT:

Я обнаружил, что использование модуля pause и аргумента prompt делает то, что я хотел:

---
- pause:
      prompt: "Sudo password for localhost "
  when: ( env == 'local' ) and
      ( inventory_hostname == "localhost" ) and
      ( hostvars["localhost"]["ansible_become_password"] is not defined )
  register: sudo_password
  no_log: true
  tags:
       - always

Ответ 3

Это действительно невозможно по умолчанию в Ansible. Я понимаю причины, почему это не позволяет, но я думаю, что это может быть уместно в некоторых контекстах. Я писал развертывание AW2 EC2 script, используя синюю/зеленую систему развертывания, и в какой-то момент роли мне нужно спросить у пользователя, нужно ли откатывать, если что-то пошло не так. Как сказано, нет никакого способа сделать это (условно и/или не-fugly).

Итак, я написал очень простой плагин действий Ansible (2.x), основанный на действии паузы из стандартной библиотеки. Это немного спартанец, потому что он принимает только одно нажатие клавиши, но это может быть полезно. Вы можете найти его в Github gist здесь. Вам нужно скопировать весь файл Gist в каталог action_plugins каталога вашей книги. См. Документацию в файле.

Ответ 4

Как видно из исходного кода, ключевое слово when не реализовано для vars_prompt (и на самом деле никогда был). То же самое было упомянуто в этом комментарии Github .

Единственный способ, с помощью которого vars_prompt в настоящее время является условным, состоит в том, что он только запрашивает, когда уже определена переменная (определенная в name) (с использованием аргумента командной строки extra_vars).