条件に応じてデフォルト値を変更可能


16

ある条件(つまり、別の変数の値)に従ってロール変数のデフォルト値を変更することは可能ですか?

詳細

コマンドに関連する2つの変数がenvありcomposer_optsます。

両方がデフォルト(env = "prod"およびcomposer_opts = "--no-dev")のままになっている場合は、すべて問題ありません。

に変更envするdevと、もう一方のデフォルトがコマンドを中断するため、常に両方を設定する必要があります。カスタムスクリプト/ ifで条件付きデフォルト値を設定することでこれを回避することは可能でしょうか?

重要:値に従って常にcomposer_opts値を設定する必要はありませんenv。まだ設定されていない場合にのみ設定します(動的なデフォルト値)。

擬似コード

私はこのようなことをしたいと思います(次のコードは無効です、私のニーズを表現するための単なる擬似コード)

---
# defaults/main.yml

env: prod
composer_opts: 
    when: "{{env}}" = 'prod'
        '--no-dev --optimize-autoloader --no-interaction'
    when: "{{env}}" = 'dev'
        '' 

回答:


12

私はこの解決策を提案します:

---
 - set_fact:
     composer_opts: ""
   when: "{{env}}" == 'dev'

変数が ' 'に等しい場合、composer_opts変数を文字列""に設定します。envdev

更新された質問に基づいたプレイブックの例を次に示します。

$ cat test.yml

---
- hosts: 127.0.0.1
  connection: local
  tasks:
  - set_fact:
      composer_opts: "{% if env == 'prod' %} '--no-dev --optimize-autoloader --no-interaction' {% else %} '' {% endif %}"

  - debug: var=composer_opts

サンプル出力:

sudo ansible-playbook test.yml -e env=dev

PLAY [127.0.0.1] ************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [127.0.0.1]

TASK: [set_fact ] ************************************************************* 
ok: [127.0.0.1]

TASK: [debug var="{{composer_opts}}"] ***************************************** 
ok: [127.0.0.1] => {
    "var": {
        " '' ": " '' "
    }
}

PLAY RECAP ******************************************************************** 
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0   


sudo ansible-playbook test.yml -e env=prod

PLAY [127.0.0.1] ************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [127.0.0.1]

TASK: [set_fact ] ************************************************************* 
ok: [127.0.0.1]

TASK: [debug var="{{composer_opts}}"] ***************************************** 
ok: [127.0.0.1] => {
    "var": {
        " '--no-dev --optimize-autoloader --no-interaction' ": " '--no-dev --optimize-autoloader --no-interaction' "
    }
}

PLAY RECAP ******************************************************************** 
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0   

1
これはソリューションの一部です。「dev」のcomposer_opts場合envは常に空の文字列に設定され、実際の値セットが上書きされます。条件は次のように拡張する必要があると思いますwhen: "{{env}}" == 'dev' and "{{composer_opts}}" is undefined。それはよさそうですか?それに応じて質問を更新できますか?
フランチェスコアベニ

composer_optsはデフォルト値を持っているため定義されます。タスクを解決するには別の式が必要です。たとえば、変数custom_composer_opts。
ナバーン

何をしたいのかを擬似コードで詳しく説明してください。それに応じて回答を更新します。
ネイバーン

追加の説明と擬似コードのサンプルで質問を更新しました。ありがとうございました。
フランチェスコアベニ

回答を更新しました。確認してください。私はあなたが必要なものを理解したと信じています。
ネイバーン

4

一方でNavernの答え@作業を行い、私は(組み込みJinja2の表記を発見した"{% if env == 'prod' %} ...表記に非常に影響を受けやすいので、かなり壊れやすいです)。たとえば、次のテストされていないコードのように、読みやすくするために問題の行をラップする場合:

composer_opts: >
               "{% if env == 'prod' %}
                   '--no-dev --optimize-autoloader --no-interaction'
                {% else %}
                   ''
                {% endif %}"

追加の空白やといった予期しない結果になり\nましたcomposer_opts

私が使用しているアプローチは非常に控えめですが、より安定しています:

- name: set composer_opts for dev env
  set_fact:
     composer_opts: ''
     when: "{{env}}" == 'dev'

- name: set composer_opts for prod env
  set_fact:
     composer_opts: '--no-dev --optimize-autoloader --no-interaction'
     when: "{{env}}" == 'prod'

また、このブログ投稿は、本質的に同じアプローチに従っているので便利であることがわかりました。


@secは、|代わりに使用する場合>、空白の問題がない可能性があります。(または、それ以上のLOLを取得します)
マイケル

@sec '>-'を使用して、ansible仕様を確認してください。複数行の文字列を正しく操作するための多くのオプションがあります。 yaml-multiline.info 特に、ブロックチョッピングインジケーターに注意してください。
-DylanYoung

このソリューションには優先順位の問題もあったことに注意してください。事実はデフォルトではありません。
-DylanYoung

2

1つのライナーの条件に基づいたAnsible set_fact:

- name: "set composer_opts based on environment"
  set_fact:
     composer_opts:  "{{ '--no-dev --optimize-autoloader --no-interaction' if (env == 'prod') else '' }}"

他のソリューションと同じ優先順位の問題(事実はデフォルトではありません)が、この条件をdefaults.ymlファイルに入れると、このソリューションは機能します。条件に依存するデフォルトの数がある場合、それは
本当にく
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.