Ansible プレイブック - 条件付き変数連結

Ansible プレイブック - 条件付き変数連結

ホームディレクトリの特定の部分を移行 (コピー) する作業タスクがあります (最後から 2 番目の行が重要です)。

- name: "Migrate my-pc module home files"
  copy:
    src: "{{ migration_source_path }}{{ item }}"
    dest: "{{ migration_destination_path }}{{ item }}"
  loop: "{{ migration_paths_my_pc }}"
  when:
    - not is_migrating_all
    - "'{{ migration_source_path }}{{ item }}' is exists"
    - m_my_pc | bool

どちらの..._path変数も常にスラッシュ ( /) で終わります。

説明:からファイル パスのリストを取得しmigration_paths_my_pc、それらを から にコピーしますmigration_source_pathmigration_destination_pathこれは、そのモジュールのフラグが設定されている場合 ( m_my_pc)、パスがソースに存在する場合、および homedir からすべてのファイルをまだ移行していない場合 ( ) の場合にのみ発生しますis_migrating_all

私の現在の実用的なソリューション (上記) では、次のような警告が表示されます:

[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: '{{ migration_source_path }}{{ item }}' is exists

私はそうすべきだと理解しています取り除く中括弧 {{when:セクションから条件があるため暗示とにかく、それらを中括弧で囲みます。問題は、それをどのように機能させるかがわからないことです。失敗した試みは次のとおりです:

    - vars["" + migrate_source_path + item] is exists
    - vars[migrate_source_path + item] is exists
    - vars[migrate_source_path ~ item] is exists
    - vars[migrate_source_path]vars[item] is exists
    - '' + migrate_source_path + item is exists
    - lookup('/home/k/test/test2/' + item) is exists
    - "{{ lookup('vars', 'migrate_source_path' + 'item') is exists }}"
    - "{{ lookup('vars', 'migrate_source_path') + lookup('vars', 'item') is exists }}"
    - lookup('vars', 'migrate_source_path')lookup('vars', 'item') is exists

背景:

私は実用的な理由と、Ansible と Ansible プレイブックについてさらに学ぶために、個人の PC セットアップを自動化しています。

その他の推奨事項やアドバイスも歓迎します(コメントでお願いします)。

アップデート:

移行に関する私の設計目標 (機能上の願望) は次のとおりです。

  • メンテナンス コストは低く抑えたいのですが、必要な場合にはどのパスがコピーされ、どのパスがスキップされたかという情報を取得したいです。そこで、スクリプトは、パスにソースがない場合に停止したりエラーをスローしたりせずに、ソースに存在するパスをコピーする必要があると考えました。警告やその他のわかりやすいメッセージがあれば便利です。現在のスクリプトでは、これを問題なく実行しています。
  • どのパスにコピーを試行し、どのパスに試行しないかを簡単に切り替えられると便利です (たとえば、移行に関連して何かが変わる可能性があります)。 でこれを行うとproject/vars/直感的に思えるため、タスク内で切り替えるよりも優れた設計になる可能性があります。コメント アウトまたは変更される可能性が高い他の変数も同様ですproject/vars/。何かをコメント アウトまたはコメント解除することは、ほとんどのテキスト エディターと IDE で単一のホットキーです。非常に便利です。

答え1

あなたの試みは複雑すぎます。すでに Jinja 式として解釈されるものの中にあるため、条件では Jinja 区切り文字を使用しないでください。そのため、目的の結果をもたらすものに置き換える必要があります。

この場合、2 つの変数を連結した文字列を作成しているため、連結に置き換える必要があります。

    - (migration_source_path ~ item) is exists

migrate_source_pathあなたの例ではと の両方が使用されているmigration_source_pathため、私は恣意的に をmigration_source_path正しいものとして選択しました。

あなたは次のような人と親しかったです:

    - '' + migration_source_path + item is exists

しかし、YAML パーサーが好まない不要な先頭の空文字列があり、それを正しく引用符で囲むか、不要な文字列を削除して修正すると、次のようになります。

    - "'' + migration_source_path + item is exists"
    - migration_source_path + item is exists

括弧で正しい順序を強制しなかったため、migration_source_pathと を追加しようとします。item is exists

答え2

少し違う書き方をしてみましょう。 を使って配列をループする代わりに、またはloopでコピーしたいディレクトリを指定します。ある宛先から別の宛先にコピーしたいファイルのリストが本当に必要な場合は、 の部分にリストを記述できます。モジュールはソース ファイルが存在するかどうかをテストし、エラーを表示します。その場合、これは良いことです。そうでなければ、移行に欠陥が生じるからです。withwith_fileglobwith

Ansible は、タスク自体やその動作を制御するのではなく、タスクをいつ実行するか、あるいは実行しないかを指示するために使用することに注意してくださいwhen。これを実現するには、ハンドラー、レジスター、およびその他のリソースを使用します。

よろしくお願いします。

関連情報