2017-05-20 12 views
0

複数の設定ファイルを一連のディレクトリに展開する必要があります。コピー中に複数のsrcと宛先にwith_fileglobを使用する

- name: Deploy apache configuration files 
    template: src={{ item.src }} dest=/etc/httpd/{{ item.dest }} mode=0644 
    with_fileglob: 
    - { src: "../templates/apache_templates/conf/*.conf", dest: 'conf' } 
    - { src: "../templates/apache_templates/conf.d/*.conf", dest: 'conf.d' } 

上記のタスクを実行すると、以下のエラーが表示されます。

An exception occurred during task execution. The full traceback is: 
Traceback (most recent call last): 
File "/usr/lib/python2.7/site-packages/ansible/executor/task_executor.py", line 90, in run 
items = self._get_loop_items() 
File "/usr/lib/python2.7/site-packages/ansible/executor/task_executor.py", line 205, in _get_loop_items 
items = mylookup.run(terms=loop_terms, variables=self._job_vars, wantlist=True) 
File "/usr/lib/python2.7/site-packages/ansible/plugins/lookup/fileglob.py", line 34, in run 
term_file = os.path.basename(term) 
File "/usr/lib64/python2.7/posixpath.py", line 121, in basename 
i = p.rfind('/') + 1 
AttributeError: 'dict' object has no attribute 'rfind' 

fatal: [server1.example.com]: FAILED! => { 
"failed": true, 
"msg": "Unexpected failure during module execution.", 
"stdout": "" 

}

Iは、上記課題にwith_itemswith_fileglobを交換する場合は、パスが存在しないため、奇数msg": "Unable to find '../templates/apache/conf/*.conf' in expected paths."エラーをスローします。

ただし、以下のように設定ファイルをハードコードすると、タスクは意図した通りに動作します。私はこの作業を取得するにはどうすればよい

- name: Deploy apache configuration files 
    template: src={{ item.src }} dest=/etc/httpd/{{ item.dest }} mode=0644 
    with_items: 
    - { src: "../templates/apache_templates/conf/vhost1.conf", dest: 'conf' } 
    - { src: "../templates/apache_templates/conf.d/example1.conf", dest: 'conf.d' } 

を展開するために、複数の設定ファイルを持っているので、この方法は、ループの目的に反しタスクを書きますか?

+0

質問は何ですか?になり、その後その結果、../templates/apache_templates/confregex_replaceの正規表現は/まですべてを置き換える返しますか。すべてが期待通りに機能するからです。 'with_fileglob'ルックアップを誤ってしまい、Anipalがエラーを返します。 2つのタスクを書くと、完了です。 – techraf

+0

1)あなたの質問に答えを含めないでください。 2)スペルチェッカーを使用します。 3)あなたの問題をより明確に説明するのに役立たないものはすべて削除します(ソリューションなしで問題があることがわかっている場合は、そうでない場合はここにいません)。 4)常に、**常に**あなたのポストに質問を入れてください。 (つまり、疑問符で終わる文章を追加しましたが、より具体的にすることができます)。 – Anthon

答えて

1

あなたはあなたのソースパスから抽出できる2つの宛先パスを使用していることに疑問があります。だから、上記の質問のためにこれを使うことができます。あなたが使用している設定は動作しません。この方法で使うことができます。

1.{{item | dirname | regex_replace('.*/','')}}これはパスから、フォルダ名を返します。たとえば、あなたのパスが../templates/apache_templates/conf/*.confで、その後dirnameフィルタはconf

--- 
- hosts: your_host 
    gather_facts: no 
    tasks: 
    - name: "Copy files from source to destination" 
    copy: 
    src: "{{item}}" 
    dest: "{{item | dirname | regex_replace('.*/','')}}" 
    with_fileglob: 
    - "../templates/apache_templates/conf/*.conf" 
    - "../templates/apache_templates/conf.d/*.conf" 
--- 
+1

@Sahilありがとうございます。あなたの推薦に基づいて実際に何が効果があったかを反映するために質問を修正しました。テンプレートには変数が含まれていたのでコピーをテンプレートに変更し、 '/ etc/httpd'を送り先の先頭に追加しました。送り先のパスに' conf'が見つからないという不満があったからです。 – crusadecoder

関連する問題