2017-12-18 4 views
-1

ディレクトリにファイルをリストし、別のディレクトリにコピーしようとしています。登録された変数を配列としてAnsibleに渡すにはどうしたらいいですか?

これは私の脚本です:

--- 
- hosts: testserver 
    become: true 
    tasks: 
    - name: list files 
    command: " ls /root/" 
    register: r 
    - debug: var=r 

    - debug: msg="item.item={{item.item}}, item.stdout={{item.stdout}}, item.changed={{item.changed}}" 
    with_items: "{{r.results}}" 

これは私が取得していますエラーです:

が失敗しました! =>:あなたはあなたの変数rの内容を示していますがdebugタスクを持って

+1

'results'はあなたがループ –

答えて

0

{「MSG」「『のdictオブジェクトは』 『結果』は属性を持っていません」}。 resultsという名前の鍵がありますか?

hereと記載されているように、値がループに登録されている場合は、resultsキーが表示されます(item.itemを使用する必要があります)。あなたはそれをやっていないので、rの構造ははるかに簡単になります。

あなたがls出力の行を反復処理しようとしている場合、あなたはおそらくしたい:

- debug: 
    msg: "filename={{item}}" 
    with_items: "{{r.stdout_lines}}" 
+0

の値(複数可)を登録するときitem.itemもエラー –

+0

--- 与えるのみ有効です - ホストを:TESTSERVER は次のようになります。真 タスク: - 名前:リストファイル コマンド: "LS /ルート/" レジスタ: "R" - デバッグ:VAR = R - デバッグ:MSG = {{}} item.item with_items: - 「{{ r.stdout_lines}} " –

+0

はい、' item.item'はtに同じエラーを与えています彼と同じ理由。ここの私の例では、私はそれを使用していないことに注意してください。 – larsks

0

私はディレクトリ内のファイルを一覧表示し、他のいくつかのディレクトリにコピーしようとしています。

  1. Don't parse ls output! Ansibleで、またどこにもどちらも。

  2. commandモジュールを使用しないでください。Ansibleはネイティブなものを提供しています。

Ansibleは、ファイルのリストを返すfind moduleを持っています。あなたの場合:

- name: list files 
    find: 
    paths: /root 
    register: my_find 

- debug: 
    var: item.path 
    with_items: "{{ my_find.files }}" 
関連する問題