使用 Ansible 在 Windows 服务器上安装 SSL 证书

发布于:2025-06-07 ⋅ 阅读:(21) ⋅ 点赞:(0)

在本教程中,我将向您展示如何使用 Ansible 在 Windows 服务器上安装 SSL 证书。使用 Ansible 自动化 SSL 证书安装过程可以提高 IT 运营的效率、一致性和协作性。我将介绍以下步骤:

  1. 将 SSL 证书文件复制到服务器
  2. 将 PFX 证书导入指定的存储区
  3. 获取导入的证书
  4. 将证书绑定到网站
  5. 重启网站
  6. 运行 Ansible 脚本

先决条件


开始之前,请确保您已满足以下先决条件:

  • 本地计算机上已安装 Ansible
  • SSL 证书文件(.pfx 格式)和密码
  • 目标 Windows 服务器的访问权限

 步骤 1:将 SSL 证书文件复制到服务器


首先,我将使用 win_copy 模块将 SSL 证书文件复制到目标服务器。这是必要的,因为证书文件需要在服务器上可访问才能导入。以下是执行此步骤的 playbook 任务:

 

  - name: Copy SSL certificate file to server
    win_copy:
      src: "{{ certificate_source_path }}\\{{ certificate_name }}.{{ certificate_file_extension }}"
      dest: "{{ certificate_target_path }}\\{{ certificate_name }}.{{ certificate_file_extension }}" 

此任务使用 win_copy 模块将证书文件从源路径复制到目标路径。src 和 dest 选项分别指定源路径和目标路径。请务必将 certificate_source_path、certificate_name、certificate_file_extension 和 certificate_target_path 替换为您的证书的实际值。

步骤 2:导入 PFX 证书


接下来,我将使用 win_pfx_certificate 模块将 PFX 证书导入到指定的存储区。执行此步骤的 playbook 任务如下:

  - name: Import PFX Certificate
    win_pfx_certificate:
      path: "{{ certificate_target_path }}\\{{ certificate_name }}.{{ certificate_file_extension }}" 
      password: "{{ lookup('env', 'CERTIFICATE_PASSWORD') }}"
      store: "{{ store_name }}"
      exportable: yes
      force: yes

 此任务使用 win_pfx_certificate 模块导入位于指定路径的证书。password 选项指定证书的密码,store 选项指定导入证书的存储位置。exportable 选项设置为 yes 表示允许导出私钥,force 选项设置为 yes 表示如果证书已存在于存储中,则覆盖该证书。

步骤 3:获取导入的证书


我将使用 win_certificate 模块从目标 Windows 服务器上指定的证书存储区检索导入的证书。name 和 store 选项指定要检索的证书的名称和存储区。

register 选项将此任务的结果存储在名为 imported_certificate 的变量中,该变量可在后续任务中使用。

- name: Get Certificate
    win_certificate:
      name: "{{ certificate_name }}"
      store: "{{ store_name }}"
    register: imported_certificate

此任务很有用,因为我需要在其他任务中使用该证书,例如将其绑定到 IIS 网站。

步骤 4:将证书绑定到网站


证书已导入,我们可以将其绑定到网站了。为此,我将使用 win_iis_website_binding 模块。以下是执行此步骤的 playbook 任务:

 

- name: Bind Certificate to Websites (except Default Web Site)
    win_iis_website_binding:
      name: "{{ item }}"
      certificate_hash: "{{ imported_certificate.thumbprint }}"
      certificate_store: "{{ store_name }}"
      binding_information: "*:443:"
      state: present
    when: "item != 'Default Web Site'"
    loop: "{{ iis_target_website_names }}"

 此任务使用 win_iis_website_binding 模块将证书绑定到 iis_target_website_names 列表中的每个网站。certificate_hash 和 certificate_store 选项指定要使用的证书,binding_information 选项指定网站的绑定信息,在本例中使用端口 443 上的 HTTPS。when 条件确保证书未绑定到默认网站。loop 选项指定应将此任务应用于 iis_target_website_names 列表中的每个网站。

步骤 5:重启网站


最后,我将使用 win_iis_website 模块重启网站。此步骤必不可少,因为上一步中所做的绑定更改只有在网站重启后才会生效。重启网站可确保使用新的 SSL 证书。以下是执行此步骤的 playbook 任务:

  - name: Restart Websites (except Default Web Site)
    win_iis_website:
      name: "{{ item }}"
      state: started
    when: "item != 'Default Web Site'"
    loop: "{{ iis_target_website_names }}"

此任务将重新启动 iis_target_website_names 列表中指定的网站(默认网站除外)。win_iis_website 模块用于管理 IIS 网站的状态。在本例中,state 选项设置为 started,这意味着如果网站已停止,则将启动该网站;如果网站已启动,则保持原样。when 条件确保默认网站不受此任务的影响。如果您出于某些原因不想重新启动默认网站,这将非常有用。loop 选项指定该任务应应用于 iis_target_website_names 列表中的每个网站。这允许您使用单个任务指定要重新启动的多个网站。

步骤 6:运行 Ansible playbook

运行playbook之前,先定义好变量:

 var.yml 内容 

---
certificate_source_path: "C:\\path\\to\\certificate\\source"
certificate_target_path: "C:\\path\\to\\certificate\\target"
certificate_name: "mycert"
certificate_file_extension: "pfx"
store_name: "Personal"
iis_target_website_names:
  - Site_XYZ
  - Site_ABC

ansible-playbook 命令用于运行 Ansible playbook。playbook是一个脚本,定义了一系列将由 Ansible 在托管主机上执行的任务。

--extra-vars 选项用于在运行时将变量传递给playbook。此选项的参数应采用 YAML 字典的形式。@ 符号表示该值是文件系统上包含 YAML 字典的文件的路径。该路径应在 @ 符号后提供。-i 选项指定 Ansible 清单文件的路径。清单文件是一个文本文件,其中列出了托管主机的主机名或 IP 地址,并按主机组分组。playbook.yml 参数是要运行的playbook的路径。

ansible-playbook --extra-vars "@vars.yml" -i inventory.ini playbook.yml