2016-10-06 4 views
0

Я использую ansible 2.1 для любого rsync или скопируйте файл с главной машины на удаленную. Файл находится в каталоге, но имеет случайную строку как часть ее имени. Я попытался использовать ls -d, чтобы получить имя через команду оболочки и попытался зарегистрировать это значение, но, судя по всему, синтаксис, который я использую, вызывает потерю роли. Любые мысли о том, что я могу делать неправильно?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 

Если возможно, вставить «стать» в вашем PlayBook не в файле задач/main.yml, если вы не только хотите использовать стать для этих двух задач и будет добавлять больше задач к такой же playbook позже сверху.

Примечание: Строка debug msg полностью необязательна. Это никак не влияет на результаты воспроизведения, все, что он сделает, показывает вам имя папки/файла, которое было найдено в результате команды «ls» оболочки.

+0

спасибо @avalon - попробуем и вернемся. Вы фантастика! –

+0

работает как шарм - потрясающий материал! –

2

Вы должны избегать команд shell, если это возможно, это Ansible anti-pattern.
В вашем случае вы можете использовать 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) –

+1

Вы используете 'local_action' в вопросе, поэтому' lookup' является предпочтительным способом. Если вы хотите это на удаленном компьютере, вы должны использовать модуль 'find' и зарегистрировать результат поиска. –

Смежные вопросы