解決策 1:
with_fileglob
を使用できます テンプレート ディレクトリからファイルのリストを取得し、フィルタを使用して次のように j2 拡張子を取り除きます:
- name: create x template
template:
src: "{{ item }}"
dest: /tmp/{{ item | basename | regex_replace('\.j2$', '') }}
with_fileglob:
- ../templates/*.j2
解決策 2:
Michael DeHaan (Ansible の作成者) が CoderWall に投稿し、非常によく似た問題について語っています。必要に応じて調整および拡張できます (権限や所有権など)。投稿の関連部分は次のとおりです:
これは、「with_items
」を使用して簡略化できます " と単一の notify
声明。いずれかのタスクが変更された場合、Playbook の実行の最後に再起動する必要があるのとまったく同じ方法で、サービスに通知されます。
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items:
- { src: 'templates/foo.j2', dest: '/etc/splat/foo.conf' }
- { src: 'templates/bar.j2', dest: '/etc/splat/bar.conf' }
notify:
- restart fooserv
複数の一意の引数を取るタスクがあるため、単に「item
」とは言いません。 'template:
の " ' 行、ただし with_items
を使用 ハッシュ (辞書) 変数を使用します。必要に応じて、リストを使用して少し短くすることもできます。これはスタイル上の好みです:
- name: template everything for fooserv
template: src={{item.0}} dest={{item.1}}
with_items:
- [ 'templates/foo.j2', '/etc/splat/foo.conf' ]
- [ 'templates/bar.j2', '/etc/splat/bar.conf' ]
notify:
- restart fooserv
もちろん、「groupvars/webservers
」のように、別のファイルで調べていたリストを定義することもできます。 " webservers
に必要なすべての変数を定義するファイル グループ、または「varsfiles
」からロードされた YAML ファイル " プレイブック内のディレクティブ。これを行うと、これがどのようにクリーンアップされるかを見てください。
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items: {{fooserv_template_files}}
notify:
- restart fooserv
解決策 3:
ラッセルの答えは機能しますが、改善が必要です
- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
- files/*.j2
regex_replace の正規表現が間違っていたため、すべての $ の最初の部分を削除する必要があります。第二に、すべてのファイルはテンプレート ディレクトリではなくファイル ディレクトリにある必要があります
解決策 4:
ファイル ツリーでのアクションに役立つファイル ツリー ルックアップ プラグインを作成しました。
- https://github.com/ansible/ansible/pull/14332 (Ansible v2.x)
- https://github.com/ansible/ansible/pull/14628 (Ansible v1.9.x)
ファイル ツリー内のファイルを再帰的に処理し、ファイル プロパティに基づいてアクション (テンプレートやコピーなど) を実行できます。相対パスが返されるため、ターゲット システムでファイル ツリーを簡単に再作成できます。
- name: Template complete tree
template:
src: '{{ item.src }}'
dest: /web/{{ item.path }}
force: yes
with_filetree: some/path/
when: item.state == 'file'
より読みやすいプレイブックになります。
解決策 5:
以下のコマンドは、テンプレート内の j2 ファイルを再帰的に検索し、それを移動先に移動するのに役立ちました。目的地へのテンプレートの再帰コピーを探している人に役立つことを願っています.
- name: Copying the templated jinja2 files
template: src={{item}} dest={{RUN_TIME}}/{{ item | regex_replace(role_path+'/templates','') | regex_replace('\.j2', '') }}
with_items: "{{ lookup('pipe','find {{role_path}}/templates -type f').split('\n') }}"