web-dev-qa-db-ja.com

ansibleを使用してテンプレートファイルのフォルダーをデプロイする

各ファイルにテンプレートモジュールを使用するのではなく、テンプレートと同じ名前を使用して、.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
49
Trololololol

with_fileglobを使用して、テンプレートディレクトリからファイルのリストを取得し、フィルターを使用して次のようにj2拡張機能を削除します。

- name: create x template
  template:
    src: "{{ item }}"
    dest: /tmp/{{ item | basename | regex_replace('\.j2$', '') }}
  with_fileglob:
    - ../templates/*.j2
71
Russell

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

ラッセルの答えは機能しますが、改善が必要です

- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
   - files/*.j2

Regex_replaceの正規表現が間違っていたため、すべての$の最初に行く必要があります。次に、すべてのファイルはテンプレートディレクトリではなく、ファイルディレクトリにある必要があります。

9
HJ_VORTEX

私は、ファイルツリーのアクションに役立つファイルツリールックアッププラグインを作成しました。

ファイルツリー内のファイルを再帰的に実行し、ファイルのプロパティに基づいてアクション(テンプレートやコピーなど)を実行できます。相対パスが返されるので、ターゲットシステムでファイルツリーを簡単に再作成できます。

- name: Template complete tree
  template:
    src: '{{ item.src }}'
    dest: /web/{{ item.path }}
    force: yes
  with_filetree: some/path/
  when: item.state == 'file'

より読みやすいプレイブックになります。

8
Dag Wieers

以下のコマンドは、テンプレート内の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') }}"
3
Robin

ディレクトリから実際のファイルのリストを自動的に取得し、後でそれらを繰り返す可能性があります。

- 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() }}"
1
Roman Dolejsi