it-roy-ru.com

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

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

31
AnneTheAgile

Согласно ответам от devs и быстрому тесту, который я провел с последней версией, vars_Prompt запускается перед "GATHERING FACTS". Это означает, что env var SSHPWD всегда является null во время проверки с помощью when

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

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

В Ansible был сделан упор на автоматизацию, и мы не хотим задавать вопросы на уровне задач.

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

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

33
adm_

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

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

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

Полный пример здесь:

---
- hosts: localhost
  vars_Prompt:
    - Prompt: Enter blah value
    - default: "{{ my_blah }}"
    - name: blah

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

Правка:

Я обнаружил, что использование модуля 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
25
tehmoon

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

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

4
Confiks

Это работает для меня (2.3) .. сделать два бита в одном файле . Это позволяет мне создать файл tmp vars при запуске playbook через jenkins .. но также разрешить подсказки в командной строке

И вы можете сделать это только с одним используемым вар

---
- name: first bit                                    
  hosts:                            all
  connection:                       local            
  tasks: 
  - set_fact:                                  
      favColour:                   "{{ favColour }}" 
    when: favColour is defined

- name: second bit                                    
  hosts:                            all
  connection:                       local            
  vars_Prompt:
    favColour: 
      Prompt:                       "Whats ya favorite colour: "
    when: favColour is not defined

  tasks:
    - debug:                        msg="{{favColour}}"
2
Alex Pretty

Основываясь на ответе Техмуна с некоторыми изменениями, я сделал это так:

- hosts:
    - hostA
  become: yes
  pre_tasks:
    - pause:
        Prompt: "Give your username"
      register: Prompt
      no_log: yes
      run_once: yes
    - set_fact:
        username: "{{Prompt.user_input}}"
      no_log: yes
      run_once: yes
    - pause:
        Prompt: "Give your password"
        echo: no
      register: Prompt
      no_log: yes
      run_once: yes
    - set_fact:
        password: "{{Prompt.user_input}}"
      no_log: yes
      run_once: yes
  tags: [my_role_using_user_pass]
  roles:
    - role: my_role_using_user_pass
1
keypress

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

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

1
Silveri