Método para integrar scripts do Powershell ao fluxo de trabalho que não é do Windows?


16

Adoro o cheiro de novas máquinas pela manhã.

Estou automatizando um fluxo de trabalho de criação de máquina que envolve vários sistemas separados em minha infraestrutura, alguns dos quais envolvem scripts perl de 15 anos em hosts Solaris, sistemas PXE Booting Linux e Powershell no Windows Server 2008.

Posso criar scripts para cada uma das partes individuais e a integração da automação Linux e Unix é bastante direta, mas não sei como vincular de maneira confiável os scripts do Powershell ao restante dos processos.

Eu preferiria que o processo começasse em um host Linux, pois imagino que ele acabe como um aplicativo da Web que vive em um servidor Apache, mas se precisar iniciar no Windows, eu hesitantemente aceito isso.

Idealmente, eu gostaria que algo parecido com psexec para Linux fosse executado no Windows, mas a resposta nessa direção parece ser de Cygwin , e por mais que eu aprecie todo o trabalho árduo que eles fazem, nunca pareceu certo , se você souber o que quero dizer. É ótimo para um desktop e oferece muitas funcionalidades, mas acho que os servidores Windows devem ser tratados como servidores Windows e não máquinas Unix bastardizadas (que, aliás, também é o meu argumento contra os servidores OSX e na verdade são Unix) . De qualquer forma, não quero ir com Cygwin, a menos que seja a última e única opção.

Então, acho que o que estou perguntando é se existe uma maneira de executar tarefas em máquinas Windows a partir do Linux. Sem Cygwin. Estou aberto a idéias e sugestões, incluindo "Olha, idiota, todo mundo usa Cygwin, então absorva e lida com isso". Desde já, obrigado!

Respostas:


5

Passei horas discutindo sobre esse problema e ele acabou se resumindo a duas opções viáveis (existem muitas opções não viáveis ​​por aí):

  1. Crie uma caixa do Windows com um serviço IIS que hospeda uma WebAPI que é domained e configurada de forma que as sessões do WinRM funcionem.
  2. Cygwin

Com a segunda opção, você fica preso na camada de abstração GNU / Posix para obter os bits reais do Windows. O que restringe o que você pode fazer com isso.

A primeira opção basicamente cria uma camada de abstração baseada na Web, que você mesmo escreve sobre sua instalação completa do Windows com pilha nativa. Se você estiver disposto a fazer o trabalho, o servidor principal do Linux só precisa fazer várias chamadas curl para fazer o que precisa ser feito. Isso funciona melhor quando os scripts são acionados e esquecidos, pois criar um sistema de retorno de chamada é muito mais trabalhoso.


Eu tinha medo dessa primeira opção :-) Há um grande tanque de tubarões cheio de problemas por lá, apenas esperando para me morder se eu fizer isso errado também. Autenticação, análise de erros, segurança geral do aplicativo ... etc etc etc. Mas obrigado pela entrada. Fico feliz por não ser a única pessoa que ficou presa nisso.
Matt Simmons

2
@MattSimmons Fiz algo semelhante em $ Job-1. As restrições de IP do IIS facilitam muito isso; se as chamadas de API podem vir apenas de um host, reduz bastante a superfície de ataque.
sysadmin1138

Eu não o usei, mas pelo que li, o WinRM pode ser executado sozinho (sem IIS ou uma API personalizada). Use roteamento restritivo e autenticação kerberos e isso soa (SOUNDS) como se pudesse ser bastante seguro. Pensamentos?
234156Preço

@laughingbovine O problema sempre foi o suporte ao WinRM. O método IIS que proponho permite fazer frente ao PowerShell com uma API REST que é suportada por quase tudo. O suporte ao WinRM mal é suportado em alguns lugares. Nos quase três anos desde que escrevi isso, esse suporte provavelmente melhorou em relação ao estado inexistente em 2012.
sysadmin1138

3

Você também pode comprar software de agendamento de plataforma cruzada ou de automação de fluxo de trabalho que pode iniciar scripts nativos em muitos hosts, dependendo das ações anteriores ou mesmo dos resultados retornados. Grandes empresas usam software como Tivoli, UC4, Espresso (CA dSeries, agora) que faz isso, e eu o usei em grandes empresas que precisavam fazer esse tipo de coisa. Para sua informação, muitas vezes eles têm suporte nativo para tarefas como tarefas da Oracle, para lhe dar uma idéia do preço que você está procurando.

(No meu trabalho anterior, eles também usavam o Cygwin de qualquer maneira , para que pudessem usar os mesmos scripts Perl sem modificação quando as cargas de trabalho se moviam entre plataformas. Muita diversão.)

Você também pode tentar criar o seu próprio, como sugere @ sysadmin1138; esse seria um projeto divertido e pode até ser robusto o suficiente para ser utilizável e não ser paginado às 2 da manhã, quando as exportações financeiras falharem na primeira tentativa.


11
Felizmente, não estou mais repassando dados financeiros :-) Isso é automação para uma faculdade. Fator de curvatura muito menor.
Matt Simmons

3

Eu usaria o recurso Powershell Web Access introduzido no Powershell v3.0. Isso permite que você use scripts do Powershell a partir de um host Linux.


2

O servidor PowerShell permite que você faça o SSH em um servidor Windows e obtenha um console do PowerShell. Não o usei além do teste gratuito, mas meu uso informal provou que era um produto bastante confiável.


Os preços são tanto que foram projetados para uso do servidor de implantação em vez de 'implantar em tudo o que é necessário gerenciar remotamente'. Exequível, apenas um modelo diferente do Linux.
sysadmin1138

2

Quão nojento você quer se sentir depois, porque sempre há telnet :)

Sério, por que você precisa que o servidor Linux chame o script do PowerShell? Você pode reprojetar seu fluxo de trabalho para que o servidor Linux simplesmente forneça a imagem boot.wim correta via tftp para um host inicializado pelo PXE? Eu tive sorte no passado, mantendo uma imagem do Windows com diferentes arquivos de resposta em um servidor de arquivos do Windows e fornecendo uma imagem de inicialização personalizada do WinPE usando o tftpd de um host Linux. Em seguida, você pode fazer com que o arquivo de resposta chame o script correto do PowerShell e não precise lidar com a excentricidade entre plataformas, como o Cygwin.


Oh, se fosse assim tão fácil. Eu não estava brincando com a parte perl de 15 anos. Estou aqui há 3 meses e ainda não estou ciente de como todas as interconexões "funcionam", mas sei que são muitas e variadas, com uma sutileza que leva as pessoas que estão aqui há anos a completamente desconsidere os recursos documentados nas ferramentas existentes desenvolvidas internamente porque ninguém sabe ao certo se / quando / como está depurado. É cabeludo. Será um projeto de vários anos para consertar tudo.
Matt Simmons

@MattSimmons Suponho que não entendo completamente os requisitos :-) Por que o servidor Linux precisa chamar o script do PowerShell? No passado, trabalhei com esse requisito mantendo informações de provisionamento de máquinas em um banco de dados (que pode ser atualizado pelo servidor * nix) e, em seguida, o WinPE consulta esse banco de dados ao determinar qual arquivo de resposta aplicar. Certamente algo semelhante pode ser adaptado a quase qualquer ambiente, certo? É basicamente apenas reconstruindo o MDT a partir do zero, por si mesmo, heh
MDMarra 15/10/12

Há coisas que (em alguns casos) precisam acontecer no lado do Windows sempre que o script da nova máquina for executado. Eu poderia iniciar as coisas do lado do Windows, mas precisaria criar um novo servidor de aplicativos da web para a interface frontal quando chegar essa hora, e estou muito mais confortável fazendo isso com PHP no Linux do que em C # (ou o que seja) no Windows . Mas como eu disse, se for preciso, preciso.
Matt Simmons

2

Você pode usar algo como nrpe para executar remotamente o script do PowerShell no host do Windows. Você pode modificar seus scripts do PowerShell para retornar os códigos de saída conforme o esperado pelo nrpe, mas não há motivo para não chamar o check_nrpe a partir dos scripts no seu host linux.


11
Isso é deliciosamente contra-intuitivo. Eu gosto disso. É um grande truque, mas ainda assim, criativo! Obrigado.
Matt Simmons

2

No tópico dos hacks contra-intuitivos , você considerou abusar do software de integração contínua como uma ferramenta de orquestração de plataforma cruzada?

Instale o mestre do IC sempre que for mais conveniente, instale o agente na sua caixa do Windows ( isto ou isto ), configure um trabalho para executar o script do PowerShell (invocando-o diretamente usando a configuração do Comando de Lote do Windows ou usando um plug-in, se desejar para escrever / manter seu script dentro do aplicativo de IC) no agente do Windows e acionar o trabalho remotamente por meio de curl ou similar.


0

Eu trabalho em uma grande empresa onde esse problema é comum. Para os processos que atualmente apoiamos, nossa abordagem é fazer com que os sistemas Unix façam chamadas na Web para um servidor Windows "admin" que esteja executando o ColdFusion no IIS. Temos classes e funções que são acionadas a partir de solicitações GET que usam a diretiva "cfexecute" para iniciar scripts específicos do PowerShell. É feio, mas funciona. Estamos analisando os recursos de serviço da Web do powershell v3 para migrar para que o ColdFusion atue como intermediário.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.