使用 Ansible 在 Windows 服务器上安装 SSL 证书系列之二

今天带大家实战一下如何通过ansible在windows 服务器上给iis web site安装证书。

前提条件:

准备一张pfx证书,可以通过openssl工具来生成,具体的步骤请参考帮助文档。
一台安装了iis 的windows 服务器

 准备inventory文件

[windows]
solarwinds ansible_host=20.47.126.72 ansible_winrm_transport=ntlm

[windows:vars]
ansible_user=azureuser
ansible_password=<yourpassword>
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

请将主机名和ip 地址替换为您自己的。

定义playbook需要用到变量文件vars.yaml

---
certificate_source_path: "/Users/ninjamac/ansible"
certificate_target_path: "C:\Temp\cert"
certificate_name: "mycert"
certificate_password: "cert export password"
certificate_file_extension: "pfx"
store_name: "My"
iis_site_ports:
    Site_XYZ: 443
    Site_ABC: 81
iis_target_website_names:
  - Site_XYZ
  - Site_ABC

请将certificate_source_path和certificate_target_path替换为您自己的实际路径。我们定义了一个字典iis_site_ports,将站点名称和要绑定的端口做了映射。

创建playbook

1. 拷贝 SSL Certificate 文件到服务器

- 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 }}"

 此任务使用 Ansible win_copy 模块将 SSL 证书文件从指定的源位置传输到目标 Windows 服务器上的目标位置。源和目标的可变路径可确保剧本保持动态并适应不同的环境。

2. 导入受密码保护的 PFX 证书

- name: Import pfx certificate that is password protected
  ansible.windows.win_certificate_store:
    path: C:\Temp\cert\mycert.pfx
    state: present
    password: {
           {certificate_password}}
    store_location: LocalMachine
    store_name: My

此任务利用 win_certificate_store 模块将 PFX 证书导入 Windows 证书存储区。该证书由其文件路径指定,并且需要密码才能访问。务必将证书导入正确的存储位置和存储名称,以确保 IIS 能够正确使用它进行 HTTPS 绑定。

3. 调试 Imported Certificate 

- name: Debug Imported Certificate
  debug:
    var: imported_certificate

导入证书后,此调试任务会输出有关已导入证书的信息,以帮助验证操作是否成功。这对于排除导入过程中可能出现的任何问题非常有用。

4.  将证书绑定到网站(默认网站除外)

- name: Bind Certificate to Websites (except Default Web Site)
  win_iis_webbinding:
    name: "{
           { item.key }}"
    certificate_hash: "{
           { imported_certificate.thumbprints[0] }}"
    certificate_store_name: "{
           { store_name }}"
    protocol: https
    port: "{
           { item.value }}"
    state: present

此关键任务将导入的 SSL 证书绑定到指定的 IIS 网站(默认网站除外)。它利用 win_iis_webbinding 模块,通过循环遍历 IIS 站点名称及其关联端口的字典。对于每个站点,它指定必要的参数,例如证书哈希和协议 (HTTPS),以确保正确应用 SSL 证书。

5. 重启网站(默认网站除外)

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

最后,该 playbook 包含一个任务,用于重启指定的 IIS 网站以应用新配置的 SSL 绑定。这里使用了 win_iis_website 模块,并且条件确保默认网站被排除在重启操作之外。

整个playbook内容如下:

---
- name: Install SSL Certificate on Windows Server
  hosts: solarwinds
  vars_files:
    - vars.yaml  
  tasks:

  - 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 }}" 

  - name: Import pfx certificate that is password protected
    ansible.windows.win_certificate_store:
      path: C:\Temp\cert\mycert.pfx
      state: present
      password: {
           {certificate_password}}
      store_location: LocalMachine
      store_name: TrustedPublisher
    register: imported_certificate

  - name: Debug Imported Certificate
    debug:
      var: imported_certificate

  - name: Bind Certificate to Websites (except Default Web Site)
    win_iis_webbinding:
      name: "{
           { item.key }}"
      certificate_hash: "{
           { imported_certificate.thumbprints[0] }}"
      certificate_store_name: "{
           { store_name }}"
      protocol: https
      port: "{
           { item.value }}"
      state: present
    loop: "{
           { iis_site_ports | dict2items }}"

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

运行playbook 

(base) ninjamac@ninjamacdeMacBook-Air ansible % ansible-playbook --extra-vars "@vars.yaml" -i inventory.ini installcertoniis.yaml

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容