2016-10-06 98 views
0

我正在使用可行的2.1將rsync或將文件從主機複製到遠程計算機。該文件位於目錄中,但其名稱中包含一個隨機字符串。我曾嘗試使用ls -d通過shell命令獲取名稱,並試圖註冊此值,但顯然,我正在使用的語法導致該角色失敗。有關我可能做錯什麼的想法?ansible rsync或將隨機命名的文件複製到遠程計算機

--- 
- name: copying file to server 
- local_action: shell cd /tmp/directory/my-server/target/ 
- local_action: shell ls -d myfile*.jar 
    register: test_build 
- debug: msg={{ test_build.stdout }} 
- copy: src=/tmp/directory/my-server/target/{{ test_build.stdout }} dest=/home/ubuntu/ owner=ubuntu group=ubuntu mode=644 backup=yes 
    become: true 
    become_user: ubuntu 
    become_method: sudo 

例外

fatal: [testserver]: FAILED! => {"failed": true, "reason": "no action detected in task. This often indicates a misspelled module name, or incorrect module path.\n\nThe error appears to have been in '/home/user/test/roles/test-server/tasks/move.yml': line 2, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n---\n- name: transferring file to server\n^here\n\n\nThe error appears to have been in '/home/user/test/roles/test-server/tasks/synchronize.yml': line 2, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n---\n- name: transferring artifact to server\n^here\n"} 

回答

1

你需要簡化你的命令。您也不希望在模塊名稱之前加上連字符。這將導致語法錯誤,因爲它無法將該模塊識別爲操作。每個任務只能調用一個模塊。例如,這不起作用;

- name: task one 
    copy: src=somefile dest=somefolder/ 
    copy: src=somefile2 dest=somefolder2/ 

這兩個需要分成兩個單獨的任務。你的劇本也一樣。執行以下操作:

- name: copying file to server 
    local_action: "shell ls -d /tmp/directory/my-server/target/myfile*.jar" 
    register: test_build 
    - debug: msg={{ test_build.stdout }} 

    - name: copy the file 
    copy: src={{ test_build.stdout }} dest=/home/ubuntu/ owner=ubuntu group=ubuntu mode=644 backup=yes 

如果可能的話,插入「成爲」你的劇本不是在你的任務/ main.yml文件,除非你只想使用成爲這兩項任務,將增加更多的任務,以對稍後相同的手冊。

注意:調試信息行是完全可選的。它不會以任何方式影響劇本的結果,它只會顯示作爲shell「ls」命令的結果而找到的文件夾/文件名。

+0

謝謝@avalon - 會試着回來。你太棒了! –

+0

就像一個魅力 - 真棒的東西! –

2

如果可能的話應該避免shell命令,它是Ansible反模式。
你的情況,你可以使用filegloblookup喜歡如下:

- name: Copy file 
    copy: 
    src: "{{ lookup('fileglob','/tmp/directory/my-server/target/myfile*.jar', wantlist=true) | first }}" 
    dest: /home/ubuntu/ 
    owner: ubuntu 
    group: ubuntu 
    mode: 644 
    backup: yes 

如果你100%確信,只有一個這樣的文件,則可以省略wantlist=true| first - 我用它作爲一個安全網僅過濾第一個入口,如果有很多。

+0

spaciba @Konstantin - 非常有用 –

+0

查找適用於我需要在本地運行的情況之一 - 但我認爲如果需要在遠程計算機上運行,​​它將不起作用 - 有關什麼是正確方法的任何想法在遠程機器上這樣做(否則我會使用ls -d求助於shell) –

+1

在問題中使用'local_action',所以'lookup'是一個首選方法。如果你想在遠程機器上使用,你應該使用'find'模塊並註冊搜索結果。 –

相關問題