Копирование элементов powershells в ansible

У меня проблема с ансиблем. Мне нужно скопировать что-то с одного компьютера в сети на хост-машину (Windows) с помощью задачи ansible.

Я протестировал множество разных подходов, включая файл PowerScript в качестве доступной задачи и использование win_shell для прямого включения команд командной строки PowerShells.

В каждом случае, когда я вызываю Copy-Item прямо на хост-машине в окне Powershell, все работает нормально. Но после вызова Ansible я получил

Copy-Item : Cannot find path '//[ip]/[path]/[file]' because it does not exist.

При входе на хост-машину я использую одного и того же пользователя как для доступа, так и для подключения к удаленному рабочему столу.

Кто-нибудь знает, что может происходить?

доступная задача:

  - name: Install 7Zip
    win_shell: |
      $path = '//[ip]/[path]/[file]'
      Copy-Item $path -Destination "C:/[Location]"
    tags:
      - 7zip

[ip], [path], [file] и [location] - это просто имитация, которую я поставил, чтобы не беспокоить вас всех польскими именами папок и моим IP-адресом в интрасети.

В команде powershell точно так же, как и в ansible:

PS C:\Users\ansibler> $path = '//[ip]/[path]/[file]'
PS C:\Users\ansibler> Copy-Item $path -Destination "[location]"

что такое [ip], [path], [file] и [location]? они переменные, вы используете это немного? Вы также можете предоставить команду, которую вы используете напрямую, для сравнения. Пожалуйста редактировать вопрос, чтобы добавить эту информацию.

Baptiste Mille-Mathias 10.09.2018 10:22

@ BaptisteMille-Mathias готово

Thaven 10.09.2018 10:30

Следующим шагом для отладки будет регистрация задачи, отладка вывода и добавление этого в вопрос.

Baptiste Mille-Mathias 10.09.2018 10:37
1
3
1 538
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы пытаетесь использовать путь UNC, в пути UNC используется обратная косая черта.

- name: Install 7Zip
    win_shell: |
      $path = '\\[ip]\[path]\[file]'
      Copy-Item $path -Destination "C:/[Location]"
    tags:
      - 7zip

лучший способ скопировать файл - использовать модуль win_copy.

- name: Install 7Zip
    win_copy:
      src: '\\[ip]\[path]\[file]'
      dest: "C:\[Location]"
      remote_src: True

Обновлять:

Вы получили ошибку из-за двойного прыжка. Я могу показать вам обходной путь, сопоставив диск перед попыткой копирования, эта работа позволяет обойти проблемы с двойным прыжком.

- name: Install 7Zip
    win_shell: |
      net use \\[ip]\[path] password /user:username 2>&1
      $path = '\\[ip]\[path]\[file]'
      Copy-Item $path -Destination "C:/[Location]"
    tags:
      - 7zip

вывод такой же, несмотря на направление косой черты

Thaven 10.09.2018 10:50

вы пробовали win_copy ?. При доступе из удаленного общего ресурса PowerShell придется обрабатывать двойной прыжок, поэтому рекомендуется win_copy.

Prasoon Karunan V 10.09.2018 11:03

Да, я попробовал. Эффект такой же: "module_stderr": "Exception calling \"Run\" with \"1\" argument(s): \"Exception calling \"Invoke\" with \r\n\"0\" argument(s): \"The running command stopped because the preference variable \"\r\nErrorActionPreference\" or common parameter is set to Stop: Access is denied\"\"\r\nAt line:65 char:5\r\n+ $output = $entrypoint.Run($payload)\r\n+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n + CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordE \r\n xception\r\n + FullyQualifiedErrorId : ScriptMethodRuntimeException\r\n \r\n"

Thaven 10.09.2018 11:09

Не могли бы вы зарегистрировать команду, которую вы разместили в вопросе, отладить ее и прикрепить выполнение задач в вопросе?

Baptiste Mille-Mathias 10.09.2018 11:13

Никогда так не получалось, даже с UNC. Выкладываю свой рабочий пример. Спасибо всем за ссылки

Aldo Bassanini 12.05.2019 08:54
Ответ принят как подходящий

Хорошо, я решаю это.

двойной прыжок был проблемой. Решением было использовать ansible_become и повторно аутентифицировать пользователя на хост-машине:

vars:
  ansible_become: yes
  ansible_become_method: runas
  ansible_become_flags: logon_type=new_credentials logon_flags=netcredentials_only
  ansible_become_user: [login]
  ansible_become_pass: [password]

@Tom - Я сделаю это, но это можно будет сделать через два дня после публикации ответа;).

Thaven 11.09.2018 08:54

Для меня это работало так:

 - name: Run Shell Copy Cmd
   win_shell: Copy-Item '\\remote\public\foo\*' C:\Windows\Temp\bar
   become: yes
   become_method: runas
   become_user: vagrant
   vars:
     ansible_become_password: "pass"

Я пробовал то же самое с модулем win_copy, но так и не смог заставить его работать

Другие вопросы по теме