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

在本教程中,我将向您展示如何使用 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
相关推荐
风清再凯3 天前
自动化工具ansible,以及playbook剧本
运维·自动化·ansible
IT乌鸦坐飞机3 天前
ansible部署数据库服务随机启动并创建用户和设置用户有完全权限
数据库·ansible·centos7
遇见火星17 天前
如何使用Ansible一键部署MinIO集群?
ansible
粥周粥17 天前
ANSIBLE
ansible
码农101号17 天前
Linux中ansible模块补充和playbook讲解
linux·运维·ansible
码农101号17 天前
Linux的Ansible软件基础使用讲解和ssh远程连接
ansible
烟雨书信18 天前
ANSIBLE运维自动化管理端部署
运维·自动化·ansible
碎碎-li18 天前
ANSIBLE(运维自动化)
运维·自动化·ansible
@donshu@21 天前
Linux运维-ansible-python开发-获取inventroy信息
linux·运维·ansible
Kendra91924 天前
Ansible
ansible