web-dev-qa-db-ja.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が実行されますbefore「事実の収集」。これは、SSHPWDを使用したチェック時には、env var nullは常にwhenであることを意味します。

残念ながら、タスクレベルでvars_Promptステートメントを許可する方法はないようです。

Michael DeHaanの理由は、タスクレベルでプロンプトを許可すると、多くの質問をする役割への扉が開かれるからです。これにより、これを行うAnsible Galaxyロールの使用が困難になります。

Ansibleの自動化には明確な重点が置かれており、タスクレベルで質問することは私たちが本当にやりたいことではありません。

ただし、再生レベルでvars_Promptの質問を行い、タスク全体でこれらの変数を使用できます。ロールで質問することはできません。

そして本当に、それは私が強制したいものです-多くのギャラクシーの役割が質問を始めたら、私は迷惑であることがわかります:)

34
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
28
tehmoon

実際、これはAnsibleのデフォルトでは不可能です。私はそれを許可しない背後にある理由を理解していますが、いくつかのコンテキストではが適切だと思います。ブルー/グリーンデプロイシステムを使用して、AWS EC2デプロイスクリプトを記述してきました。ロールのある時点で、何か問題が発生した場合にロールバックを行う必要があるかどうかをユーザーに尋ねる必要があります。前述のように、これを行う方法はありません(条件付きおよび/または非フグリ)。

そこで、標準ライブラリの一時停止アクションに基づいて、非常にシンプルなAnsible(2.x)アクションプラグインを作成しました。キーを1回押すだけでよいという点で少し質素ですが、役に立つかもしれません。 Github Gist here で見つけることができます。 Gistファイル全体を action_plugins プレイブックディレクトリのディレクトリ。ファイル内のドキュメントを参照してください。

4
Confiks

tehmoon's いくつかの修正を加えた答えに基づいて、私はそのようにしました:

- 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
2
keypress

これは私のために動作します(2.3).. 1つのファイルで2ビットを実行します。これにより、jenkins経由でPlaybookを実行するときにtmp varsファイルを構築できますが、コマンドラインでプロンプトを表示することもできます。

そして、あなたは使用された1つの変数のみでそれを行うことができます

---
- 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

ソースコード に見られるように、whenキーワードはvars_Promptに実装されていません(実際には実装されていません)。同じことがこのGithubで言及されていました comment

vars_Promptが現在条件付きである唯一の方法は、変数(nameで定義)が既に定義されている場合にのみプロンプトを出すことです(コマンドラインextra_vars引数を使用)。

1
Silveri