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


47

テンプレート.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

回答:


67

あなたは使用することができwith_fileglob、あなたのテンプレートディレクトリからファイルのリストを取得し、このようなJ2の拡張子を取り除くためにフィルタを使用します。..

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

11
注はwith_fileglob常にから動作しfiles/ますが、でテンプレートに到達できます../templates/mytemplate/*stackoverflow.com/a/27407566/1695680
ThorSummoner

2
おかげで、これは非常に便利です。regex_replace関数でリテラルピリオドをエスケープするには、2つのバックスラッシュを使用する必要があることがわかりました。たぶん、destテンプレート部分全体を二重引用符で囲んで、タスク定義にYAML形式を使用できるようになったためです(1ライナー形式よりも好みです)。
トニーチェザロ

1
これはのみを前提としたテンプレートは、あなたが、あなたがwith_filetree必要がフォルダーテンプレート内で両方のディレクトリとファイルをサポートする必要がある場合は、フォルダ内のファイルをライブ-参照stackoverflow.com/questions/41667864/...
danday74

パターンがファイル名内に存在する可能性がある場合に、regex_replace行末で一致する必要があるメモ\.j2$
ブレットライアン

20

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

複数の一意の引数を取るタスクがあるため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/webserverswebserversグループに必要なすべての変数を定義する「」ファイルやvarsfiles、プレイブック内の「」ディレクティブからロードされたYAMLファイルなど、別のファイルでリストを定義することもできます。どうすればクリーンアップできるのか見てください。

- name: template everything for fooserv
  template: src={{item.src}} dest={{item.dest}}
  with_items: {{fooserv_template_files}}
  notify: 
      - restart fooserv

5
簡単な方法は、書くことがあるかもしれないtemplate: src=templates/{{item}}.j2 dest=/etc/splat/{{item}}.confし、次に項目のプレーンなリストを使用しますwith_items: - foo - bar
イーサン・

これは実際には間違って見えます。正しいテンプレート行は次のようになりますtemplate: src={{item.src}} dest={{item.dest}}(つまりでは${var}なく{{var}}
ファビアーノフランチェスコ

@FabianoFrancesconiが更新されました。
Mxx

9

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

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

regex_replaceの正規表現が間違っていたので、すべての$のモミは行く必要があります。第二に、すべてのファイルはテンプレートディレクトリではなくファイルディレクトリにあるべきです


4
サーバー障害へようこそ!あなたの答えは、質問に対する実行可能な解決策が以前の答えを通して利用可能であることを示唆しているため、その答えの編集としてより適切です。現在の回答を削除し、ラッセルの回答の編集を提案することを検討してください。
ポール

7

ファイルツリーのアクションを支援できるファイルツリールックアッププラグインを作成しました。

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

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

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


まだ統合されていません:-(
モーガンクリスチャンソン

2
統合されました。
ダグウィアーズ16

* .confファイルのみをフィルターする方法はありますか?
アンドレイ

もちろん、「when:」の部分では、ニーズに合った式を書くことができます。
ダグウィアーズ

1
プラグインは低速ではありません。各ファイルを個別にテンプレート化してコピーするプロセスが低速になります。しかし、それはプラグインとはほとんど何の関係もありません。プラグインは、テンプレート化やコピー以外のことに役立ちます。
ダグウィアーズ

3

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

1

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

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

改行での分割に関する標準的な注意事項に注意してください。ファイル名には改行が含まれる場合があります。より安全なソリューションはprint0、などをサポートするシェルユーティリティを使用してfindから、分割すること\u0000です。
デジェイクレイトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.