我喜欢早上闻到新机器的味道。
我正在自动化一个机器创建工作流,它涉及我的基础架构中的多个独立系统,其中一些涉及 Solaris 主机上 15 年的 perl 脚本、PXE 引导 Linux 系统和 Windows Server 2008 上的 Powershell。
我可以编写每个单独部分的脚本,集成 Linux 和 Unix 自动化相当简单,但我不知道如何可靠地将 Powershell 脚本与其余进程联系在一起。
如果该进程在 Linux 主机上开始,我更愿意这样做,因为我认为它最终会成为一个运行在 Apache 服务器上的 Web 应用程序,但如果它需要在 Windows 上开始,我犹豫不决。
理想情况下,我希望 Linux 的psexec之类的东西能够在 Windows 上运行,但是Cygwin似乎给出了这个方向的答案,尽管我很欣赏他们付出的所有辛勤工作,但感觉从来都不对,如果你明白我的意思。它非常适合桌面并提供很多功能,但我觉得 Windows 服务器应该像 Windows 服务器一样对待,而不是混蛋的 Unix 机器(顺便说一句,这也是我反对 OSX 服务器的论点,它们实际上是Unix) . 无论如何,除非这是最后也是唯一的选择,否则我不想使用 Cygwin。
所以我想我要问的是是否有一种方法可以从 Linux 在 Windows 机器上执行作业。没有Cygwin。我对想法和建议持开放态度,包括“看白痴,每个人都使用 Cygwin,所以接受并处理它”。提前致谢!
我花了几个小时研究这个问题,最终归结为两个可行的选择(那里有很多不可行的选择):
使用第二个选项,您将无法通过 GNU/Posix 抽象层获得实际的 Windows 位。这确实限制了你可以用它做什么。
第一个选项几乎构建了一个基于 Web 的抽象层,您可以在完整的本机堆栈 Windows 安装之上自行编写。如果您愿意投入工作,Linux 主服务器只需执行一堆 curl 调用即可执行需要执行的操作。不过,当脚本是即发即弃时,这种方法效果最好,因为构建回调系统需要付出更多的努力。
您还可以购买跨平台调度或工作流自动化软件,这些软件可以根据先前的操作甚至返回的结果在许多主机上启动本机脚本。大型企业使用 Tivoli、UC4、Espresso(现在是 CA dSeries)等软件来执行此操作,我已经在需要执行此类操作的大型企业中使用过它。仅供参考,这些通常对诸如 Oracle 作业之类的东西有原生支持,让您了解您可能正在查看的价格标签。
(在我过去的工作中,无论如何他们也使用 Cygwin ,这样当工作负载在平台之间移动时,他们可以使用相同的 Perl 脚本而无需修改。很有趣。)
正如@sysadmin1138 所建议的那样,您也可以尝试构建自己的;那将是一个有趣的项目,甚至可能最终变得足够强大,可以使用,并且不会在第一次尝试金融导出失败时让您在凌晨 2 点被传呼。
我会使用 Powershell v3.0 中引入的 Powershell Web Access 功能。这允许您从 Linux 主机使用 Powershell 脚本。
PowerShell 服务器允许您通过 SSH 连接到 Windows 服务器并获取 PowerShell 控制台。我没有在免费试用后使用它,但我的非正式使用向我证明它是一个相当可靠的产品。
之后你想感觉有多恶心,因为总是有 telnet :)
不过说真的,为什么需要 Linux 服务器来调用 PowerShell 脚本?您能否重新设计您的工作流程,以便 Linux 服务器通过 tftp 将正确的 boot.wim 映像传送到 PXE 引导的主机?过去我运气不错,在 Windows 文件服务器上保存了一个带有不同答案文件的 Windows 映像,并使用 Linux 主机的 tftpd 提供了一个自定义 WinPE 引导映像。然后,您可以让应答文件调用正确的 PowerShell 脚本,而不必像 Cygwin 那样处理跨平台问题。
您可以使用 nrpe 之类的东西在 Windows 主机上远程执行 powershell 脚本。您可能想修改您的 powershell 脚本以返回 nrpe 预期的退出代码,但没有理由不能从您的 linux 主机上的脚本调用 check_nrpe。
关于反直觉黑客,您是否考虑过将持续集成软件滥用为跨平台编排工具?
在最方便的地方安装 CI master ,在你的 Windows 机器上安装代理( this或this),配置一个作业来执行你的 powershell 脚本(使用 Windows Batch 命令配置直接调用它,或者如果你想使用插件在 Windows 代理上编写/保留脚本在 CI 应用程序中)并通过 curl 或类似工具远程触发作业。
我在一家大型企业工作,这个问题很常见。对于我们目前支持的进程,我们的方法是让 Unix 系统对在 IIS 上运行 ColdFusion 的“管理”Windows 服务器进行 Web 调用。我们有从 GET 请求触发的类和函数,这些请求使用“cfexecute”指令启动特定的 powershell 脚本。这很丑陋,但它有效。我们正在研究 powershell v3 Web 服务功能,以摆脱让 ColdFusion 充当中间人的角色。