Alguém resolveu o problema de salto duplo com clientes Ansible e Windows?

1

Minha situação: Eu tenho um servidor Ansible, um servidor Tower, um servidor de arquivos do Windows e um cliente Windows. Através do Ansible, eu quero dizer ao cliente do Windows para copiar alguns arquivos do servidor de arquivos do Windows. Depois de ter dificuldade em encontrar um módulo de manual de jogo que me permitisse copiar arquivos de um host remoto para uma máquina cliente, decidi experimentar uma série de diferentes scripts e cmdlets do Powershell para executar a cópia de arquivo simples.

Parece que estou correndo para o problema do salto duplo e como um servidor Ansible / Linux é a máquina de origem nesse cenário - e eu não tenho controle sobre essa máquina - fiquei me perguntando se alguém resolveu esse problema e conseguiu para obter scripts para passar pelo salto duplo. Como alternativa, se alguém souber de um módulo Ansible que possa copiar arquivos de um host remoto para um host do cliente, isso também seria interessante. Se eu precisar enviar um ingresso para os donos do Ansible fazer alguma coisa, ou se eu precisar fazer alguma coisa, ou se eu desistir, seja qual for o caso, obrigado pelo seu tempo!

    
por DrewJenseric 21.03.2017 / 22:53

1 resposta

1

Embora este seja um hack absoluto, e eu tenho certeza que você já se mudou deste problema, uma solução é criar uma tarefa agendada (usando o comando schtasks do Windows) e executá-la imediatamente para executar a cópia. A tarefa agendada será executada no contexto adequado e poderá ser copiada do servidor sem encontrar o problema de salto duplo, porque se origina da máquina cliente. Tenho certeza de que há uma solução real de nível Ansível para esse problema, mas esta é a minha solução atual.

Seu script de nível mais alto pode usar psutil ou algo semelhante para monitorar a tarefa e não retornar até que a tarefa agendada seja concluída.

Aqui está um script auxiliar que escrevi em Python para realizar isso:

# 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

Você pode chamar isso de um script de nível mais alto para executar operações e driblar o salto duplo. Muito hacky, mas funciona. Exemplo de uso do script seria:

start /wait py -3 run_as_scheduled_task.py 'robocopy' 'robocopy SOURCE DEST'

Um método alternativo é chamar psexec na máquina de destino com o sinalizador -s para usar a conta do sistema. Mais informações sobre isso aqui: link

    
por 26.04.2017 / 21:08