Моя ситуация: у меня есть сервер Ansible, сервер Tower, файловый сервер Windows и клиент Windows. Через Ansible я хочу сказать клиенту Windows скопировать некоторые файлы с файлового сервера Windows. После проблем с поиском модуля playbook, который позволил бы мне копировать файлы с удаленного хоста на клиентский компьютер, я решил попробовать серию различных скриптов и командлетов Powershell для выполнения простого копирования файлов.
Кажется, я столкнулся с проблемой двойного прыжка, и поскольку сервер Ansible / Linux является исходной машиной в этом сценарии, а я не контролирую эту машину, мне было интересно, решил ли кто-нибудь эту проблему и смог получить сценарии чтобы пройти двойной прыжок. В качестве альтернативы, если кто-то знает модуль Ansible, который может копировать файлы с удаленного хоста на клиентский, это тоже будет интересно. Если мне нужно отправить запрос владельцам Ansible, чтобы они что-то сделали, или если мне нужно что-то сделать, или если я должен сдаться, в любом случае, спасибо за ваше время!
Хотя это абсолютный хакер, и я уверен, что вы уже отошли от этой проблемы, одним из способов решения этой проблемы является создание запланированной задачи (с использованием Windows schtasks команда) и немедленно выполните ее, чтобы выполнить копирование. Запланированная задача будет выполняться в правильном контексте и сможет копировать с сервера, не столкнувшись с проблемой двойного прыжка, поскольку она исходит от клиентского компьютера. Я уверен, что есть реальное решение этой проблемы на уровне Ansible, но это мой текущий обходной путь.
Ваш сценарий более высокого уровня может использовать psutil или что-то подобное для отслеживания задачи и не возвращаться, пока запланированная задача не будет завершена.
Вот вспомогательный сценарий, который я написал на Python для этого:
# run_as_scheduled_task.py
import psutil
import subprocess
import time
import sys
to_match = sys.argv[1]
to_run = ' '.join(sys.argv[2:])
print("Running the following command as immediate scheduled task:")
print(to_run)
print("Will return only once process matching wildcard \"{0}\" is no longer found".format(to_match))
subprocess.call('C:\\Windows\\System32\\schtasks /delete /f /tn "QUICKSCHTASK"', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
subprocess.call('C:\\Windows\\System32\\schtasks /create /tn "QUICKSCHTASK" /tr "{0}" /sc ONCE /st 00:00'.format(to_run), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
subprocess.call('C:\\Windows\\System32\\schtasks /run /tn "QUICKSCHTASK"', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
time.sleep(0.1)
def processDead(proc):
print("Process is now dead - {0}".format(proc))
subprocess.call('C:\\Windows\\System32\\schtasks /delete /f /tn "QUICKSCHTASK"', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
process = None
for proc in psutil.process_iter():
if to_match in proc.name():
gone, still_alive = psutil.wait_procs([proc], None, processDead)
break
Вы можете вызвать это из сценария более высокого уровня для выполнения операций и обхода двойного прыжка. Очень хакерский, но работает. Пример использования скрипта:
start /wait py -3 run_as_scheduled_task.py 'robocopy' 'robocopy SOURCE DEST'
Альтернативный метод - вызвать psexec на целевой машине с флагом -s для использования учетной записи System. Подробнее об этом здесь: https://stackoverflow.com/questions/15242248/double-hop-access-to-copy-files-without-credssp
Для таких проблем есть обходной путь. Вы можете написать сценарий Powsershell на средней машине и добавить его в планировщик задач. Затем запустите этот планировщик задач с доступного сервера, выполнив саму задачу
системная учетная запись будет иметь доступ только к ресурсу внутри локальной системы с наивысшими привилегиями. Как он может получить доступ к другому серверу в UNC.
И если мы создадим Sch taks с другим пользователем и запустим его из ansible .... он будет создан с учетной записью ansible, а задачи sch не запускаются, поскольку «по умолчанию выбран параметр RUN, только когда пользователь вошел в систему»