我们希望听到您的意见!帮助我们深入了解 Ansible 生态系统的现状。
参与 2024 年 Ansible 项目调查

Windows 包管理

Windows 包管理

欢迎阅读我们以 Windows 为中心的“入门系列”的第三部分!

在上一篇文章中,我们介绍了如何使用 Ansible 和 Ansible Tower 来帮助管理您的 Active Directory 环境。本文将介绍如何在您的域中配置这些机器中的一些。本文的大部分内容将集中在特定的模块上。Ansible 拥有大量可用于 Windows 的模块,您可以在此处找到它们。由于时间有限,我今天无法讨论所有模块,而只讨论一些广泛使用的模块。

MSI 和 win_package 模块

所以您已经搭建了域,并向其中添加了机器,现在让我们在这些机器上安装一些东西。在继续讨论我们将要讨论的模块之前,我有一些说明。模块 win_msi 已弃用,将在 Ansible 2.8 中删除(截至本文发布时的当前版本为 2.5)。您可以使用win_package来代替它,我将在本文中使用它。

好了,回到安装内容。win_package 模块是首选。它专门用于需要安装或卸载的.msi.exe文件。这些文件还可以从本地、URL 或网络资源获取。

模块中的参数提供了很大的灵活性。从 Ansible 2.5 开始,您现在可以列出您的参数,模块将根据需要对参数进行转义。但是,在处理 MSI 包时建议使用字符串,因为 MsiExec 存在独特的转义问题。

下面是一些关于如何使用 win_package 模块的示例。第一个示例显示了如何安装 Visual C++ 并列出参数

- name: Install Visual C thingy with list of arguments instead of a string
  win_package:
    path:
http://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe
    product_id: '{CF2BEA3C-26EA-32F8-AA9B-331F7E34BA97}'
    arguments:
    - /install
    - /passive
    - /norestart

上面,我们看到产品 ID 已列出。虽然 Ansible 可以并且确实会在 MSI 为本地文件时提取 ID,但我们不想强制主机下载 MSI(如果不需要)。当您提供产品 ID 时,Ansible 可以快速检查软件包是否已安装,而无需首先从互联网下载可能很大的 MSI。您也可以在不提供产品 ID 的情况下进行安装。下面是一个示例:

- name: Install Remote Desktop Connection Manager locally omitting the product_id
  win_package:
    path: C:\temp\rdcman.msi
    state: present

如前所述,您还可以从网络共享下载并指定访问该共享所需的凭据。以下示例展示了它的实际操作,从网络资源安装 7-zip:

- name: Install 7zip from a network share specifying the credentials
  win_package:
    path: \\domain\programs\7z.exe
    product_id: 7-Zip
    arguments: /S
    state: present
    user_name: DOMAIN\User
    user_password: Password

Windows 包管理和 Chocolatey

与大多数 Linux 发行版不同,Windows 没有内置的包管理器。Windows 确实有 Windows 应用商店,但我认为其中很少有产品进入数据中心。

但是,有一个名为 Chocolatey 的社区项目为 Windows 用户提供了完整的包管理体验。它有助于减轻管理原始setup.exe.msi文件带来的某些痛苦。而且,您知道,我们有一个模块可以用于它!

但在我们开始讨论模块之前,让我们进一步了解 Chocolatey。对于可能是 Mac 用户的人来说,一个好的比较是,Chocolatey 类似于 Homebrew。Chocolatey 旨在使用了解版本控制和依赖项要求的打包框架轻松处理 Windows 软件的所有方面(安装程序、zip 存档、运行时二进制文件、内部和第三方软件)的管理。

Chocolatey 模块的使用方式与其 *nix 对应模块类似,简单而强大。它对版本有一个软性要求。我的意思是,它需要 v. 0.10.5 才能运行,但如果 Chocolatey 没有看到该版本,它会为您更新它。更棒的是,如果机器上不存在 Chocolatey,模块也会在执行分配的任务之前为您安装它。

要开始使用该模块,最简单的示例之一可能是安装轻量级 CLI 工具。让我们使用 git,因为每个人的工作流程都一样,对吧?

- name: Install git
  win_chocolatey:
    name: git
    state: present

说笑归说笑,安装 git 就是这么简单。如果您需要特定版本的软件,安装其他版本的软件也同样容易。假设您需要 Notepad++ 6.6 版本。它看起来像这样:

- name: Install notepadplusplus version 6.6
  win_chocolatey:
    name: notepadplusplus
    version: '6.6'

在指定版本时需要注意的一点是:确保将其作为字符串输入(请参阅 6.6 周围的两个引号)。原因是,如果它不是作为字符串输入的,则会被视为 YAML float。许多有效的版本号无法正确转换为 float 并产生相同的结果(例如,对于大多数版本控制方案,'6.10' != '6.1',但作为 float 的 6.10 将变为 6.1),因此养成始终引用版本号的习惯以确保它们不会被重新格式化是一个好习惯。

某些软件包可能需要交互式用户登录才能进行安装。要传递正确的凭据,您可以使用become来实现此目的。以下示例显示了需要使用become的软件包的安装。请注意,您可以成为:System,它将不需要您提供密码。

- name: Install a package that requires 'become'
  win_chocolatey:
    name: officepro2013
  become: yes
  become_user: Administrator
  become_method: runas

win_chocolatey模块强大而功能丰富,但在某些情况下,如果不使用 become 将无法工作。没有简单的方法来确定软件包是否需要 become,因此最好的方法是先尝试不使用它,如果失败则使用become

Windows 自动化中的软件包和巧克力棒

总结这篇博文,我们介绍了两种自动化 Windows 环境中软件包安装的方法。无论您是全面使用 Chocolatey 还是需要安装一些软件包,Ansible 都能以简单易读的格式为您完成所有这些操作以及更多操作。

在“Windows 自动化入门”系列的下一篇文章(也是最后一篇文章)中,我们将讨论使用 Ansible 在 Windows 中进行安全和更新!