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

使用 Sensu 和 Ansible 进行代码监控

使用 Sensu 和 Ansible 进行代码监控

一个全面的基础设施即代码 (IaC) 计划应包括监控和可观察性。将被管理基础设施的主动监控纳入其中,可以形成一种共生关系,在这种关系中,故障会自动检测到,从而实现事件驱动的代码更改和新部署。

在这篇文章中,我将回顾我与 Tadej Borovšak(XLAB Steampunk 的 Ansible 布道师,我们与之合作开发了 Sensu Go 的认证 Ansible 内容集合)联合主持的一个网络研讨会。您将了解代码监控如何作为 IaC 工作流的反馈循环,从而改进整体自动化解决方案,以及如何使用 Sensu Go 的认证 Ansible 内容集合自动化您的监控(包括演示!)。

在我们深入探讨之前,先简要概述一下 Sensu。

关于 Sensu

Sensu 是一款交钥匙可观察性管道,可在任何云上(从裸机到云原生)提供代码监控。Sensu 为 DevOps 和 SRE 团队提供了一个灵活的可观察性平台,使他们能够重复使用现有的监控和可观察性工具,并与最佳解决方案(如 Red Hat Ansible Automation Platform)集成。

使用 Sensu,您可以重复使用现有的工具,例如 Nagios 插件,以及监控短暂的基于云的基础设施,例如 Red Hat OpenShift。Sensu 通过填补可观察性方面的空白来帮助您消除数据孤岛——整合工具以将指标、日志和跟踪整合到同一个管道中,然后根据您的组织需求随意分发它们。您还可以使用内置的自动修复功能或与 Red Hat Ansible Automation Platform 等产品的集成来自动化诊断和自我修复。

为什么监控 + 自动化?

简单来说,监控是您几乎需要持续进行的操作,以提供有关故障和缺陷的实际信息。自动化是指对某些事情采取行动——它不一定是持续的操作。如果发生故障并且您可以自动化其修复,那么您将节省宝贵的人工时间。

通过将被管理基础设施的主动监控纳入其中,您可以受益于一种共生关系,在这种关系中,新的指标和故障会自动收集和检测,以响应代码更改和新部署。我们将此概念定义为代码监控,它是统一查看世界和管理整个应用程序生命周期的关键。

使用代码监控,您可以像使用 Ansible 自动化声明基础设施即代码一样声明监控工作负载。基础设施即代码和代码监控处于并行轨道上,服务于不同的目的。使用Sensu Go 的 Ansible 内容集合,您可以轻松地部署您的监控,启动后端集群并将您的代理作为配置的一部分放入基础设施中。从那里,代码监控方面接管:您可以更新您的监控,而无需在每次想要进行小的监控更改时都重新配置现有的基础设施。

使用 Sensu Go 的 Ansible 内容集合进行 Sensu 自动化

Sensu Go 的 Ansible 内容集合使您能够更轻松地创建 Sensu Go 监控代理和后端的完全功能的自动化部署。以下演示展示了一个最小的 Sensu 设置:如何安装后端和两个代理,以及建立更安全的连接,因为我们将从后端传递敏感信息到代理。

Ansible 用户可能熟悉“清单”一词。在这种情况下,我们的清单文件包含两个定义的组:后端组和代理组。我们清单文件中的信息告诉 Ansible 如何通过 SSH 安全地连接我们的主机。

---
all:
  vars:
    ansible_ssh_common_args: >
      -o IdentitiesOnly=yes
      -o BatchMode=yes
      -o UserKnownHostsFile=/dev/null
      -o StrictHostKeyChecking=no
      -i demo
  children:
    backends:
      hosts:
        backend:
          ansible_host: 192.168.50.20
          ansible_user: vagrant
    agents:
      hosts:
        agent0:
          ansible_host: 192.168.50.30
          ansible_user: vagrant
        agent1:
          ansible_host: 192.168.50.31
          ansible_user: vagrant

https://gist.github.com/tadeboro/00cabf8fa79f4c9c90cda8cdf9645f32#file-inventory-yaml

我们还需要一种方法来指定我们希望资源处于哪种状态。输入 Ansible Playbook,我们将使用它来设置后端。它是一个 YAML 文件,既可读又可执行。

---
- name: Install, configure and run Sensu backend
  hosts: backends
  become: true

  tasks:
    - name: Setup secret environment variables
      ansible.builtin.template:
        src: secrets.j2
        dest: /etc/sysconfig/sensu-backend
      vars:
        secrets:
          MY_SECRET: value-is-here

    - name: Install backend
      include_role:
        name: sensu.sensu_go.backend
      vars:
        version: 6.1.0

        cluster_admin_username: >-
          {{ lookup('ansible.builtin.env', 'SENSU_USER') }}
        cluster_admin_password: >-
          {{ lookup('ansible.builtin.env', 'SENSU_PASSWORD') }}
        # mTLS stuff
        agent_auth_cert_file: certs/backend.pem
        agent_auth_key_file: certs/backend-key.pem
        agent_auth_trusted_ca_file: certs/ca.pem

https://gist.github.com/tadeboro/00cabf8fa79f4c9c90cda8cdf9645f32#file-backend-yaml

我们将使用此 playbook 执行两个主要功能

  1. 在后端设置环境变量,我们将在此处存储敏感信息。我们将使用Sensu 内置的密钥管理来安全地存储和共享这些信息。
  2. 安装和配置 Sensu 后端。对于安装,我们将使用后端 Ansible 角色,并使用我们文件中指定的变量对其进行参数化。在此示例中,我们指定要安装的 URL、如何初始化数据库以及如何设置我们需要安全后端和代理之间通信的安全连接。

值得注意的是,此示例展示了如何将敏感信息保存在 playbook 之外,使其完全安全地共享并提交到您的版本控制系统。

我们将输入以下命令来执行 playbook

ansible-playbook -i inventory.yaml backend.yaml

尽管 playbook 相对较短,但 Ansible 实际上执行的操作非常复杂:向发行版添加存储库、安装组件、复制 TLS 证书,以及使用指定的用户名和密码配置和初始化后端。不到半分钟,我们就启动并运行了一个 Sensu Go 后端!

我们登录到Sensu Web UI,但现在还看不到任何内容,因为我们还需要设置代理,我们将使用代理 playbook 来准备它们。

---
- name: Install, configure and run Sensu agent
  hosts: agents
  become: true

  tasks:
    - name: Install agent
      include_role:
        name: sensu.sensu_go.agent
      vars:
        version: 6.1.0

        # mTLS stuff
        cert_file: certs/backend.pem
        key_file: certs/backend-key.pem
        trusted_ca_file: certs/ca.pem

        agent_config:
          name: "{{ inventory_hostname }}"
          backend-url:
            - wss://{{ hostvars['backend']['ansible_host'] }}:8081

https://gist.github.com/tadeboro/00cabf8fa79f4c9c90cda8cdf9645f32#file-agent-yaml

它与我们的后端 playbook 非常相似;主要区别在于主机参数和角色名称,因为我们正在执行 playbook 以在主机上安装 Sensu 代理。对于后端 playbook,我们使用了默认配置;对于代理,我们需要指定一个名称,以便我们知道如何引用此代理。我们还需要指定后端位置。我们没有将后端地址硬编码到 playbook 中,而是告诉 Ansible 从清单文件中获取此信息,这使我们能够重复使用已存储在 Ansible 清单文件中的信息。

要执行代理 playbook 并安装代理,我运行相同的命令(更换文件名)

ansible-playbook -i inventory.yaml agent.yaml

和以前一样,Ansible 会处理安装代理所需的一切,并且安装会在两台机器上同时进行。

切换到默认命名空间中的 Sensu Web UI,在实体下,您会看到我们的两个实体已准备就绪。

Sensu Blog one

现在,我们需要为我们观察的事件配置一个事件。

注意:从 Sensu Go 6 开始,可以动态更新订阅,而无需重新启动代理。

这是我们的 Sensu 配置文件

---
- name: Manage Sensu Go resources
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Configure agent subscriptions
      sensu.sensu_go.entity:
        name: agent0
        entity_class: agent
        subscriptions:
          - demo

    - name: Enable env secrets provider
      sensu.sensu_go.secrets_provider_env:
        state: present

    - name: Configures custom secret
      sensu.sensu_go.secret:
        name: my-secret
        provider: env
        id: MY_SECRET

    - name: Create a check that uses secret
      sensu.sensu_go.check:
        name: secret-check
        command: echo $SECRET
        secrets:
          - name: SECRET
            secret: my-secret
        subscriptions: demo
        interval: 10
        publish: true

https://gist.github.com/tadeboro/00cabf8fa79f4c9c90cda8cdf9645f32#file-config-yaml

在这里,我们告诉代理监听演示订阅并执行该订阅中的任何操作。要将密钥引入检查,我们需要确保我们的密钥提供程序已准备好,并注册一个密钥,该密钥将从后端上的密钥环境变量中获取其值。最后,我们创建一个简单的检查,该检查会回显我们的密钥。

我们运行配置 playbook

ansible-playbook -i inventory.yaml config.yaml

在 Sensu Web UI 中查看,我们可以看到我们的代理已获得演示订阅。转到事件并列出所有事件,您可以看到 agent-0 执行了密钥检查,并且我们的密钥值“value-is-here”已安全地从后端传递到代理。

sensu blog two

如您所见,我们的 Ansible 内容集合允许您简洁地描述您的基础设施,让 Ansible 处理设置的复杂性。

观看下面的完整演示

https://www.youtube.com/watch?v=ShN867iRFvQ

Sensu 演示:构建监控工作流

Ansible 部署 Sensu 平台后,我们使用 Sensu 的内置配置实用程序——sensuctl CLI。使用 sensuctl,我们可以管理以下 Sensu API 资源:

  • 实体:代理 + 代理
  • 检查:代理运行的计划监控工作负载
  • 可观察性管道:过滤 + 转换 + 处理
  • 事件:Sensu Go 管道处理的基本数据结构
  • 订阅:将检查与实体松散耦合
  • 资产:可共享的二进制文件,用于支持监控工作负载;Sensu 在运行时安装,无需预配置主机

在此第一个演示中,我正在构建一个监控工作流来创建 NGINX 服务并对其进行监控,以确保其正常运行。

与我们之前的演示一样,我有一组 Ansible Playbook 可以快速创建后端和单个代理。在这里,我还使用sensuctl(用于管理 Sensu 内部的资源的命令行工具)设置了一个检查。Sensu Web UI 和 sensuctl 与相同的 REST API 交互——sensuctl 只是管理 Sensu 的另一种方式。

我们配置代理,以便它与后端通信,并且我使用 Ansible 内容集合为仅此演示定义了一个新的命名空间——与 Sensu API 交互以设置新的命名空间。我还设置了基于角色的访问控制 (RBAC),这使我可以授予用户仅用于审计的访问权限(即,他们不需要对命名空间具有写访问权限)。然后,我在代理正在运行的同一主机上设置了一个 NGINX 主机。

在我们的 NGINX 服务启动并运行后,我使用 --insecure-skip-tls-verify 设置了我们的 CLI 客户端(出于演示目的;在生产环境中不要使用此标志!)。使用 sensuctl entity list,我可以看到我们所有可用的实体和订阅(在我们的演示中,为 webinar-agent0)。我们还没有定义任何检查,因此 sensuctl check list 没有显示任何内容。我在这里使用我们的声明式 YAML 文件定义了一个名为 check-http 的检查命令,它本质上是检查我们的 NGINX 服务是否启动并运行,使用 Sensu 的动态运行时资产 来提供该命令。我在此示例中使用的 Ansible 处理程序 使用 Red Hat Ansible Tower 在该服务出现故障时尝试进行修复。

现在,当我运行 sensuctl check list 时,我看到了我们的 check-http。它处于发布状态为 false,因此我们有机会在运行检查之前定义和测试我们的检查。要运行一次检查,我运行 sensuctl execute check-http。(我一开始遇到错误,因为我需要添加资产。)您可以通过 Ansible Collection for Sensu Go 处理所有这些资源(而不是使用 sensuctl)。

我设置了一个 NTP 检查,确保它使用监控插件运行时资产(这只是从 Nagios 插件中分离出来的监控插件的构建)。我们还有我们的 NGINX 检查,它通过一个我们无需预配置的 Ruby 运行时环境进行。Ruby 环境与该插件匹配。同样,如果您希望将所有内容都保存在 Ansible Playbook 中,则所有内容都可以作为 Ansible Collection 的一部分进行处理。

NTP 和 NGINX 检查处于已发布状态,并按间隔运行——它们不需要单独执行。现在,当您查看事件列表时,您会看到两个检查都在运行。由于运行时资产存在,因此这些命令(如 sensuctl check list)作为最初执行的配置的一部分存在于代理中,而无需我安装任何其他 RPM 包或二进制文件。

就是这样:一个真正与服务一起工作的监控工作流!

观看下面的完整演示

https://www.youtube.com/watch?v=ShN867iRFvQ

开始自动化吧!

让我们回顾一下到目前为止我们所涵盖的内容:我们使用 Ansible 内容集合自动化了 Sensu 后端和代理部署,并且我们创建了一些监控代码(例如 check-http.yaml)来监控服务并使用 Ansible Automation Platform 自动化修复。现在,让我们通过将监控代码连接到我们的 CI/CD 管道(通过我们新的最佳实践工作流 SensuFlow)来自动化此监控代码的管理。SensuFlow 使用包含监控代码子目录的代码存储库,这些子目录映射到 Sensu 命名空间。SensuFlow 提供以下自动化:      

  1. 测试 sensu-backend 的可用性
  2. 测试提供的身份验证
  3. 可选地在管理下创建命名空间(如果 RBAC 策略允许)
  4. 对资源定义进行 lint 以确保所需的元数据
  5. 根据标签选择条件修剪已删除/重命名的 Sensu 资源
  6. 创建和/或修改 Sensu 资源

开始使用 SensuFlow 很简单,它需要一个 RBAC 配置文件(具有用户名和密码的用户、ClusterRole 和 ClusterRoleBinding),以及用于配置将在 CI/CD 管道中运行的 Sensu CLI 的 Sensu 后端 API URL。SensuFlow 还有一组可选的环境变量,您可以使用它们自定义多个操作行为,例如 sensuctl prune 用于删除存储库中文件不再表示的 Sensu 资源的标签选择条件(例如,如果监控代码模板被删除或重命名)。

要了解有关 sensuctl prune 的更多信息,请查看我们关于 https://sensu.io/blog/keep-your-configs-in-good-order-with-sensuctl-prune 的博文

SensuFlow 旨在与 CI/CD 平台无关,并且可以在您的开发环境中本地使用(只要安装了 sensuctl、yq 和 jq)。但我们也正在积极开发一个适用于 GitHub Action CI/CD 平台的参考实现,该实现可以与任何 GitHub 存储库一起使用。SensuFlow GitHub Action 有效地提供了 GitHub 和 Sensu Go 之间的直接集成!

查看此 监控即代码示例存储库,该存储库配置为在提交到主分支时运行 SensuFlow GitHub 操作。此存储库包含多个 Sensu 资源,包括上面 Red Hat Ansible Tower 修复示例中的检查和处理程序,但现在使用 SensuFlow 自动化 Sensu 中的更改。

要了解有关监控即代码和 SensuFlow 的更多信息,请查看我们最近关于此主题的博文和网络研讨会

希望这篇文章让您了解了使用监控即代码概念以及 Ansible Collection for Sensu Go 可以做什么。要进一步学习,请查看我们关于 使用 Sensu Ansible Tower 集成的自愈工作流的网络研讨会







深入了解 Trend Micro Deep Security 集成模块

深入了解 Trend Micro Deep Security 集成模块

在 AnsibleFest 2020 上,我们宣布扩展我们的安全自动化计划以支持端点保护用例。如果您错过了它,请查看 AnsibleFest 页面上“使用 Ansible 自动化您的端点保护”演讲的录制内容。

今天,在发布此公告后,我们发布了受支持的 Trend Micro Deep Security Ansible 内容集合。我们将逐步介绍几个示例,并描述用例以及我们设想在现实世界场景中如何使用该集合。

关于 Trend Micro Deep Security

Trend Micro Deep Security 是 Ansible 安全自动化计划的最新成员之一。作为端点保护解决方案,它保护虚拟、云和容器环境中的服务和应用程序。它提供自动化的安全策略,并在单个平台中整合不同环境中的安全方面。

如何安装 Trend Micro Deep Security 的认证 Ansible 内容集合

Trend Micro Deep Security 集合可供 Red Hat Ansible Automation Platform 客户在 自动化中心 获取,这是我们提供的软件即服务,位于 cloud.redhat.com,是 Red Hat 订阅者快速查找和使用 Red Hat 及其技术合作伙伴支持的内容的地方。

博文“自动化中心入门”介绍了自动化中心以及如何配置 Ansible 命令行工具以访问自动化中心下载集合。

完成后,即可轻松安装集合

ansible-galaxy collection install trendmicro.deepsec

Trend Micro Deep Security 的 Ansible 内容集合中有什么?

该集合的重点是支持它们的模块和插件:有一些模块用于与 Trend Micro Deep Security 代理交互,例如 deepsec_firewallrulesdeepsec_anti_malwaredeepsec_log_inspectionrules 等。基本上,集成模块涵盖了 TM Deep Security 防火墙公开的 REST API。如果您熟悉 Ansible 的防火墙集合和模块,您会认出这种模式:所有这些模块都提供了与端点安全和防火墙解决方案交互的最简单方法。使用它们,可以接收常规数据、发送任意命令和管理配置部分。

虽然这些模块为设备完全未自动化的环境提供了巨大的价值,但本文的重点是端点安全用例,其中相应集合中的模块可以帮助实现自动化。作为模块,它们具有精确的范围,但使用户能够专注于特定资源/REST API 场景,而不会受到其他内容或配置项的干扰。它们还简化了跨产品的自动化,因为其他安全集合遵循相同的模式。

以集合的方式连接到 Trend Micro Deep Security

该集合支持 httpapi 作为连接类型。

Trend Micro Deep Security 目前支持两种与 REST API 交互的方式,对于每种情况,Ansible 清单将略有更改,如下所述

对于 较新的 REST API,Ansible 清单将与网络操作系统 trendmicro.deepsec.deepsec、Trend Micro API 密钥和 api-version 密钥一起使用

[deepsec]
host_deepsec.example.com

[deepsec:vars]
ansible_network_os=trendmicro.deepsec.deepsec
ansible_httpapi_use_ssl=true
ansible_httpapi_validate_certs=false
ansible_connection=httpapi
ansible_python_interpreter=/usr/bin/python
ansible_httpapi_session_key={'api-secret-key': 'secret-key', 'api-version': 'v1'}

对于使用 旧版 REST API 的 API,Ansible 清单也将需要网络操作系统 trendmicro.deepsec.deepsec,但使用用户名和密码。

[deepsec]
host_deepsec.example.com

[deepsec:vars]
ansible_network_os=trendmicro.deepsec.deepsec
ansible_user=admin
ansible_httpapi_pass=password
ansible_httpapi_use_ssl=true
ansible_httpapi_validate_certs=false
ansible_connection=ansible.netcommon.httpapi
ansible_python_interpreter=python

请注意,在生产环境中,应以安全的方式支持这些变量,例如,借助 Red Hat Ansible Tower 凭据

用例:防火墙规则配置

防火墙非常灵活,用户可以将其配置为限制性或允许性。与入侵防御和 Web 信誉模块一样,防火墙策略基于两个原则:要么允许任何服务,除非明确拒绝;要么拒绝所有服务,除非明确允许。

例如,使用 Ansible 和 Trend Micro Deep Security 集成模块,用户可以采用限制性防火墙方法。从安全的角度来看,这通常是推荐的做法:默认情况下所有流量都被阻止,只有明确允许的流量才允许通过。

以下清单显示了实现“拒绝所有流量”方法的 playbook

---
- name: Deny all traffic
  hosts: deepsec
  collections:
   - trendmicro.deepsec
  gather_facts: false
  tasks:
   - name: Create Restrictive firewall rule
     trendmicro.deepsec.deepsec_firewallrules:
       state: present
       name: deny_all_firewallrule
       description: Deny all traffic by default over tcp
       action: deny
       priority: "0"
       source_iptype: any
       destination_iptype: any
       direction: incoming
       protocol: tcp
       tcpflags:
         - syn

运行此 playbook 将创建一个防火墙规则,该规则将明确拒绝所有 TCP syn 绑定流量。请记住,使用 state 关键字并将其设置为 present。这意味着创建指定的规则,并且模块将继续创建配置规则。相反,如果用户想要删除/丢弃任何特定的防火墙规则,则应将 state 设置为 absent:在这种情况下,在 playbook 运行期间,模块将检查指定的防火墙规则是否预先存在,如果存在,模块将继续删除/丢弃相应的防火墙规则配置。

用例:反恶意软件规则配置

反恶意软件配置通过提供针对各种基于文件的威胁(包括恶意软件、病毒、特洛伊木马和间谍软件)的实时和按需保护来帮助计算机上的代理。使用 Ansible deepsec 反恶意软件配置模块,用户可以触发所有类型的可用扫描

  • 实时扫描
  • 手动扫描
  • 计划扫描
  • 快速扫描

我们将在此处讨论的 playbook 示例将与基于事件响应的实时扫描有关。用户可以检查威胁并隔离观察到的威胁。

---
- name: Scan and Quarantine in TrendMicro agents
  hosts: deepsec
  collections:
   - trendmicro.deepsec
  gather_facts: false
  tasks:
   - name: Create AntiMalware config
     trendmicro.deepsec.deepsec_anti_malware:
       name: scan_real_time
    description: scan and quarantine via anti-malware config
    scan_action_for_virus: pass
    alert_enabled: true
    scan_type: real-time
    real_time_scan: read-write
    cpu_usage: medium
       scan_action_for_virus: quarantine
       scan_action_for_trojans: quarantine
       scan_action_for_cve: quarantine
       scan_action_for_other_threats: quarantine
    state: present

上面列出的剧本将创建一个反恶意软件配置规则,该规则将在每次收到、复制、下载或修改文件时,对 Trend Micro 代理启动实时扫描。

所有文件都将被扫描以查找任何安全威胁。如果在扫描过程中代理根据病毒、木马、CVE 等检测到任何威胁,代理将显示有关受感染文件的信息,并且相应的文件将根据剧本中指定的规则进行隔离。

用例:日志检查规则配置

日志检查集成模块帮助用户识别通常在系统/操作系统级别记录的事件。它还包括应用程序日志。使用日志规则配置,用户可以将记录的事件转发到 SIEM 系统或某些集中式日志服务器,以进行分析、报告和存档。

日志检查也有助于实时监控第三方日志文件。下面列出的剧本创建了一个用于日志检查的规则。

---
- name: Set up log inspection
  hosts: deepsec
  collections:
   - trendmicro.deepsec
  gather_facts: false
  tasks:
   - name: Create a Log inspection rule
     trendmicro.deepsec.deepsec_anti_malware:
       state: present
       name: custom log_rule for mysqld event
       description: some description
       minimum_agent_version: 6.0.0.0
       type: defined
       template: basic-rule
       pattern: name
       pattern_type: string
       rule_id: 100001
       rule_description: test rule description
       groups:
         - test
       alert_minimum_severity: 4
       alert_enabled: true
       log_files:
         - location: /var/log/mysqld.log
           format: mysql-log
     register: log






使用 VMware REST Ansible 集合自动化 RHEL 8 安装

使用 VMware REST Ansible 集合自动化 RHEL 8 安装

在 IT 基础设施中管理虚拟机通常是一项常见任务,特别是 VMware 虚拟化技术已经存在了 20 多年。VMware 管理员花费大量时间来自动化创建、管理和删除包含各种操作系统的虚拟实例。Red Hat Enterprise Linux 就是一种经常驻留在 VMware 基础设施上的操作系统。

随着 VMware REST API 的引入,我们最近宣布了 vmware.vmware_rest 集合的初始版本,供生产使用。与 community.vmware 集合相反,vmware.vmware_rest 集合基于下一代 VMware REST API。此新集合不再需要任何第三方 Python 绑定来与 VMware 基础设施通信。引入的新集合很大一部分是支持自动化虚拟机操作。

在这篇博文中,我将向您展示 VMware 用户如何使用 vmware.vmware_rest.vcenter_vm 模块和有效的 Kickstart 文件来自动化 Red Hat Enterprise Linux 8 (RHEL 8) 的安装。

场景需求

对于此场景,我们将假设以下需求

  1. vCenter 7.0.1 或更高版本,至少一个 ESXi
  2. RHEL 8 安装 DVD
  3. Ansible
  4. 已安装最新版本的 vmware.vmware_rest 集合

准备安装 ISO 文件

我们将使用通过 iso 映像文件获取的 Kickstart 文件来自动化 RHEL 8 安装。我们不会讨论 Kickstart 文件的创建和管理,因为这已在文档中介绍。您可能希望访问Kickstart 信息访问实验室来复习您的知识。

收集有关基础设施的信息

我们将使用环境变量来指定 VMware 凭据。这将使剧本简洁明了。为此,您需要指定以下环境变量

  • VMWARE_HOST
  • VMWARE_USER
  • VMWARE_PASSWORD
  • VMWARE_VALIDATE_CERTS

现在让我们从我们的剧本开始,它将在 vCenter 中创建虚拟机。vmware.vmware_rest 集合中的所有模块都使用 VMware 托管对象 ID (MoID) 来识别和引用 VMware 对象。MoID 在给定的 vCenter 中是唯一的,因此无需指定名称和文件夹。

我们需要提供虚拟机将放置在何处的信息。此信息包含群集、数据存储、文件夹和资源池的 MoID。我们可以使用 vmware.vmware_rest 集合中的现有模块来收集此信息。

- name: Get Cluster info
   vmware.vmware_rest.vcenter_cluster_info:
         filter_names:
         - "{{ cluster_name }}"
   register: cluster_info

 - name: Get Resource info for {{ cluster_name }}
   vmware.vmware_rest.vcenter_cluster_info:
         cluster: "{{ cluster_info.value[0].cluster }}"
   register: resource_pool_info

 - name: Get datastore info
   vmware.vmware_rest.vcenter_datastore_info:
         filter_names:
         - "{{ datastore_name }}"
   register: datastore_info

 - name: Get folder info
   vmware.vmware_rest.vcenter_folder_info:
         filter_names:
         - '{{ folder_name }}'
   register: folder_info

我们将需要有关虚拟机将连接到的标准端口组的信息。可以使用 vmware.vmware_rest.vcenter_network_info 模块收集有关标准端口组的 MoID 的信息。

- name: Get a list of the networks with a filter
vmware.vmware_rest.vcenter_network_info:
      filter_types: STANDARD_PORTGROUP
      filter_names:
      - "VM Network"
register: network_info

创建虚拟机

一旦我们拥有创建虚拟机所需的所有信息,让我们继续使用创建虚拟机的模块 vcenter_vm

- name: Create a VM
  vmware.vmware_rest.vcenter_vm:
      boot:
      delay: 0
      enter_setup_mode: false
      retry: false
      retry_delay: 10000
      type: "BIOS"
      boot_devices: []
      cdroms:
      - allow_guest_control: true
        backing:
          type: "ISO_FILE"
          iso_file: "[ds_200] iso/rhel_8.3_ks.iso"
        ide:
          master: true
          primary: true
        label: "CD/DVD drive 1"
        start_connected: true
        type: "IDE"
      cpu:
      cores_per_socket: 1
      count: 1
      hot_add_enabled: false
      hot_remove_enabled: false
      disks:
      - new_vmdk:
           capacity: 536870912
        label: "Hard disk 1"
        scsi:
          bus: 0
          unit: 0
        type: "SCSI"
      guest_OS: "OTHER_LINUX_64"
      hardware_version: "VMX_13"
      memory:
      hot_add_enabled: true
      size_MiB: 4096
      name: test_vm_3
      nics:
      - start_connected: true
        type: VMXNET3
          mac_type: GENERATED
          backing:
            type: STANDARD_PORTGROUP
            network: "{{ network_id }}"
      scsi_adapters:
      - label: "SCSI controller 0"
        scsi:
          bus: 0
          unit: 7
        sharing: "NONE"
        type: "PVSCSI"
      placement:
       datastore: '{{ datastore_id }}'
       folder: '{{ folder_id }}'
       resource_pool: '{{ resource_pool_id }}'
  register: vm_info

在这里,我们指定创建一个具有 4 GB 内存和 1 个连接到“VM 网络”的 NIC 的虚拟机。此外,我们还将 CDROM 附加到此虚拟机,用于安装 DVD 和其中的 kickstart 文件。

您可以使用以下任务打开虚拟机的电源

- name: Turn the power-on the VM
   vmware.vmware_rest.vcenter_vm_power:
         state: start
         vm: '{{ vm_info.id }}'

打开虚拟机的电源后,安装将作为默认选项与给定的 kickstart 文件一起启动

rhel blog one

以 Kickstart 文件作为默认选项的启动菜单

rhel blog two

Linux 内核启动参数

安装新的操作系统需要一些时间,具体取决于配置。您可以将这个新安装的虚拟机标记为模板,并将其用于克隆操作。

结论和后续步骤

将此集合与 vmware.vmware_rest 结合使用,Ansible 用户可以更好地管理 VMware 基础设施上的虚拟实例,从而实现更快的迭代和更轻松的维护。

Ansible 允许您将不同的技术与您的 VMware 基础设施连接起来,这些技术最终对于您工作的成功至关重要。

集合 vmware.vmware_rest 是 VMware 自动化的坚实基础,这将在不久的将来实现。我们一直在寻求改进,以帮助像您这样的用户以更简单、更快速的方式完成工作。