2015-12-15 15 views
5

Ansible Best Practicesは、すべてのロールに、このルールで必要なすべてのファイルを持つファイルディレクトリが含まれていることを説明しています。ロール間の共有ファイル

私の場合、私は同じファイルを共有する異なる役割を持っています。しかし、これらのファイルのソースが1つもないため、これらのファイルのコピーを各ロールに作成することはできません。そのファイルのいずれかに編集が行われると、すべてのロールに対してこの変更を行うのは面倒です。

解決策は、絶対パスまたは相対パスを使用して別のフォルダを作成して参照する方法です。 これを行う最善の方法ですか?

私ansibleディレクトリには、あなたが繰り返しを減らすために、ここで試すことができる2つの合理的にまともなアプローチを持っているこの

play.yml 
roles/ 
    web/ 
    tasks/ 
    files/ 
     common-1 
     common-2 
     other-multiple-files 
    role-2/ 
    tasks/ 
    files/ 
     common-1 
     common-2 
     other-multiple-files 
    role-3/ 
    tasks/ 
     files/ 
     common-2 
    role-4/ 
    tasks/ 
     files/ 
     common-1 
+0

新しい役割に共通のファイルを使用して2つの役割のタスクをリファクタリングし、もしᴳᵁᴵᴰᴼ@両方 –

+0

のメタ/ main.ymlで依存関係として、この新しい役割を持っています2つのルールには同じファイルが共通していますが、これを行うことはできますが、依存関係として役割を作成するファイルがいくつか含まれているルールが多くある場合は適用されません。申し訳ありませんが私はそれについて十分明確ではなかった、私は私のポイントを明確にするために質問に2つのルールを追加 – Nasr

答えて

10

のように見えます。

あなたはこのような自分の役割フォルダに兄弟として座っている別のshared-filesディレクトリかもしれない:あなたはその後、役割/ファイルフォルダからの相対的なファイルの場所での作業でこれを参照します

play.yml 
roles/ 
    web/ 
    tasks/ 
    files/ 
     other-multiple-files 
    role-2/ 
    tasks/ 
    files/ 
     other-multiple-files 
    role-3/ 
    tasks/ 
    role-4/ 
    tasks/ 
    shared-files/ 
    common-1 
    common-2 

を次のようになります。その代わり

- name: copy common-1 
    copy: 
    src: ../../common-1 
    dest: /path/to/dest/common-1 

- name: copy role specific file 
    src: other-multiple-files 
    dest: /path/to/dest/other-multiple-files 

またはフォルダへの相対パスを使用するには、このような全体で物事をシンボリックリンクできます

play.yml 
roles/ 
    web/ 
    tasks/ 
    files/ 
     common-1 -> ../../common-1 
     common-2 -> ../../common-2 
     other-multiple-files 
    role-2/ 
    tasks/ 
    files/ 
     common-1 -> ../../common-1 
     common-2 -> ../../common-2 
     other-multiple-files 
    role-3/ 
    tasks/ 
    files/ 
     common-2 -> ../../common-2 
    role-4/ 
    tasks/ 
    files/ 
     common-1 -> ../../common-1 
    shared-files/ 
    common-1 
    common-2 

そして、それは直接役割/ filesディレクトリにあったかのようにあなたは、ファイルを参照することができます。

- name: copy common-1 
    copy: 
    src: common-1 
    dest: /path/to/dest/common-1 

- name: copy role specific file 
    src: other-multiple-files 
    dest: /path/to/dest/other-multiple-files 
+1

私は本当にシンボリックリンクのアプローチが好き、それは役割をパスから解放され、パスはシンボリックリンク。 – Nasr

+0

私はシンボリックリンクを使ってファイル、テンプレートなどを共有しています。 gitはシンボリックリンクをうまく処理するので、さまざまなファイルとテンプレートディレクトリの間の相対的なシンボリックリンクはケーキです。 –

5

私のソリューションは、一般的なもののための役割を作成し、依存関係として追加することでした。

たとえば、あなたの脚本はとてもこの

play.yml 
roles/ 
    common-1/ 
    files/ 
     common-1 
    common-2/ 
    files/ 
     common-2 
    web/ 
    meta/ 
     common-1 
     common-2 
    tasks/ 
    files/ 
     other-multiple-files 
    role-2/ 
    meta/ 
     common-1 
     common-2 
    tasks/ 
    files/ 
     other-multiple-files 
    role-3/ 
    meta/ 
     common-2 
    tasks/ 
    role-4/ 
    meta/ 
     common-1 
    tasks/ 

ようになり、​​とroles/common-2だけでファイルを展開役割であり、それらを必要とするすべての役割は、彼らがmeta/で依存関係としてそれを持っていますフォルダ。

-2

質問O短い答え(短い、簡潔な答えのための余分なポイントがあるはずです):

ベターGitのサブモジュールを使用することです。 From:

http://random-notes-chris.blogspot.co.uk/2014/02/git-submodules-for-ansible-roles.html

Every role lives in its own git repo. An example is Vincent Rischmann's ansible-role-java. 
Every app (or project) has its own git repo for its Ansible configuration (inventory definition and playbooks etc.). 
The app repo has a roles sub directory. Actual roles (e.g. the java role) are then added as git submodules. 

git submodule add https://github.com/vrischmann/ansible-role-java.git roles/java 
関連する問題