使用 Ansible 在 Windows 服务器上安装 SSL 证书
在本教程中,我将向您展示如何使用 Ansible 在 Windows 服务器上安装 SSL 证书。使用 Ansible 自动化 SSL 证书安装过程可以提高 IT 运营的效率、一致性和协作性。我将介绍以下步骤:
- 将 SSL 证书文件复制到服务器
- 将 PFX 证书导入指定的存储区
- 获取导入的证书
- 将证书绑定到网站
- 重启网站
- 运行 Ansible 脚本
先决条件
开始之前,请确保您已满足以下先决条件:
- 本地计算机上已安装 Ansible
- SSL 证书文件(.pfx 格式)和密码
- 目标 Windows 服务器的访问权限
步骤 1:将 SSL 证书文件复制到服务器
首先,我将使用 win_copy 模块将 SSL 证书文件复制到目标服务器。这是必要的,因为证书文件需要在服务器上可访问才能导入。以下是执行此步骤的 playbook 任务:
- name: Copy SSL certificate file to serverwin_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 Certificatewin_pfx_certificate:path: "{{ certificate_target_path }}\\{{ certificate_name }}.{{ certificate_file_extension }}" password: "{{ lookup('env', 'CERTIFICATE_PASSWORD') }}"store: "{{ store_name }}"exportable: yesforce: yes
此任务使用 win_pfx_certificate 模块导入位于指定路径的证书。password 选项指定证书的密码,store 选项指定导入证书的存储位置。exportable 选项设置为 yes 表示允许导出私钥,force 选项设置为 yes 表示如果证书已存在于存储中,则覆盖该证书。
步骤 3:获取导入的证书
我将使用 win_certificate 模块从目标 Windows 服务器上指定的证书存储区检索导入的证书。name 和 store 选项指定要检索的证书的名称和存储区。
register 选项将此任务的结果存储在名为 imported_certificate 的变量中,该变量可在后续任务中使用。
- name: Get Certificatewin_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: presentwhen: "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: startedwhen: "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