各ファイルにテンプレートモジュールを使用するのではなく、テンプレートと同じ名前を使用して、.j2拡張子を付けずに、テンプレート.j2フォルダーでいっぱいのフォルダーをLinuxボックスにデプロイする簡単な方法はありますか?
今私は長いリストを持っています:
- name: create x template
template:
src=files/x.conf.j2
dest=/tmp/x.conf
owner=root
group=root
mode=0755
notify:
- restart myService
with_fileglob
を使用して、テンプレートディレクトリからファイルのリストを取得し、フィルターを使用して次のようにj2拡張機能を削除します。
- name: create x template
template:
src: "{{ item }}"
dest: /tmp/{{ item | basename | regex_replace('\.j2$', '') }}
with_fileglob:
- ../templates/*.j2
Michael DeHaan(Ansibleの作成者)が CoderWall に投稿し、非常によく似た問題について話しています。必要に応じて(権限や所有権など)調整および拡張できます。投稿の関連部分はここにあります:
これは、「with_items
」と単一のnotify
ステートメントを使用することで簡略化できます。タスクのいずれかが変更された場合、サービスは、プレイブックの実行の最後に再起動する必要があるのとまったく同じ方法で通知されます。
- 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
複数の一意の引数を取るタスクがあるため、 'template:
'行で "item
"とだけではなく、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
もちろん、_webservers
グループに必要なすべての変数を定義する「groupvars/webservers
」ファイルや、「プレイブック内のvarsfiles
"ディレクティブ。私たちが行う場合、これがどのようにクリーンアップできるか見てください。
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items: {{fooserv_template_files}}
notify:
- restart fooserv
ラッセルの答えは機能しますが、改善が必要です
- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
- files/*.j2
Regex_replaceの正規表現が間違っていたため、すべての$の最初に行く必要があります。次に、すべてのファイルはテンプレートディレクトリではなく、ファイルディレクトリにある必要があります。
私は、ファイルツリーのアクションに役立つファイルツリールックアッププラグインを作成しました。
ファイルツリー内のファイルを再帰的に実行し、ファイルのプロパティに基づいてアクション(テンプレートやコピーなど)を実行できます。相対パスが返されるので、ターゲットシステムでファイルツリーを簡単に再作成できます。
- name: Template complete tree
template:
src: '{{ item.src }}'
dest: /web/{{ item.path }}
force: yes
with_filetree: some/path/
when: item.state == 'file'
より読みやすいプレイブックになります。
以下のコマンドは、テンプレート内の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') }}"
ディレクトリから実際のファイルのリストを自動的に取得し、後でそれらを繰り返す可能性があります。
- name: get the list of templates to transfer
local_action: "Shell ls templates/* | sed 's~.*/~~g'"
register: template_files
- name: iterate and send templates
template: src=templates/{{ item }} dest=/mydestination/{{ item }}
with_items:
- "{{ template_files.stdout.splitlines() }}"