2015-11-17 3 views
8

私はAnsibleにおける単一事実の内容を1つのファイルを作成する必要があります。マイテンプレートファイルは次のようになりますインラインテンプレートを使用できますか?

- template: src=templates/git_commit.j2 dest=/path/to/REVISION 

:明らか

{{ git_commit }} 

、それはちょうどこのような何かをするために多くの意味を作ると思います私は現在、このような何かをやっています

- inline_template: content={{ git_revision }} dest=/path/to/REVISION 

人形は、似たようなを提供しています。 Ansibleでこれを行う方法はありますか?

答えて

8

udondananswerによって与えられる)lineinfileモジュールの別のオプションはcopyモジュールを使用して、コンテンツではなくAnsibleホストへのローカルソースを指定することであろう。私のためlineinfilecopyとしては、必ずファイルを作成するためですが、すでにあるファイルに若干の変更を行うためでなければなりませんように私は個人的にlineinfileにこれを好む

- name: Copy commit ref to file 
    copy: 
    content: "{{ git_commit }}" 
    dest: /path/to/REVISION 

例のタスクは、次のようになりますあなたが欲しいのとまったく同じように見える場所にあります。また、複数の行に対処する利点もあります。私はこのテンプレートタスクを作成し、ちょうど持つように誘惑されると思いますけれども、現実には

は、テンプレートファイルがあること:

- name: Copy commit ref to file 
    template: 
    src: path/to/template 
    dest: /path/to/REVISION 

はそれはきれいです:このタスクによって作成された

"{{ git_commit }}" 

それが意味するもののためにモジュールを使用しています。

+0

は後方srcとdestのでしょうか?私はあなたがsrc:/ path/to/REVISIONをあなたのテンプレートにしたいと思う。 OPには良い質問があります。中級者を経由することなく、インラインコンテンツから直接アクセスするとよいでしょう。 – Greg

4

はい、その単純なケースでは、lineinfileモジュールで可能です。

- lineinfile: 
    dest=/path/to/REVISION 
    line="{{ git_commit }}" 
    regexp=".*" 
    create=yes 

lineinfileモジュールは通常、特定の行がファイル内に含まれていることを確実にするために使用されます。 create=yesオプションが存在しない場合は、ファイルをクリートします。それは、デフォルトでは、単純に必ず新しいコンテンツがファイルに追加されていることを確認し、以前の内容を置き換えないのでregexp=.*オプションは、あなたがgit_commit変更された場合、ファイルにコンテンツを追加していない確認します。あなただけのファイルの1行を持っているので

これはのみ動作します。もしあなたがもっと多くの行を持っていたら、これは明らかにこのモジュールではうまくいかないでしょう。

0

この問題は解決されているようです。ただし、テンプレートファイルは、複数の変数、すなわちJSONファイルだった場合、検索と、コンテンツパラメータでコピーモジュールを使用することが可能である、すなわち:

# playbook.yml 
--- 
- name: deploy inline template 
    copy: 
    content: '{{ lookup("template", "inlinetemplate.yml.j2") }}' 
    dest: /var/tmp/inlinetempl.yml 

# inlinetemplate.yml.j2 
--- 
- name: {{ somevar }} 
    abc: def 
関連する問題