我们希望听到您的声音!帮助我们洞察 Ansible 生态系统的现状。
参加 2024 年 Ansible 项目调查




自动化体验,AnsibleFest 2022

自动化体验,AnsibleFest 2022

我们一年中最喜欢的活动就要来了!AnsibleFest 将以线下活动的形式回归,这是感受自动化全部力量的唯一地方。加入我们 10 月 18 日和 19 日在芝加哥,沉浸在这个将 Ansible 打造成行业领先的自动化技术的运动中。

AnsibleFest 2022 会议目录和议程构建器现已开放。这意味着您可以查看今年的所有会议内容并构建自己的定制体验。让我们更仔细地看一下 AnsibleFest 2022 提供的所有内容。

分组会议

今年我们将推出六条内容轨道。这些轨道包括:自动化入门、Ansible 社区、应用自动化、Ansible 自动化平台、高级 Ansible 和自动化采用。这些轨道中的会议将涵盖一系列重点领域,包括网络自动化、安全自动化、边缘自动化、IT 领导者、开发人员等等。我们还提供各种客户、合作伙伴和 Ansible 贡献者演讲,欢迎加入。您可以在我们的 会议目录 中查看所有提供的会议。

研讨会和实验室

在 AnsibleFest 的研讨会和实验室中获得动手实践经验。我们将为我们的与会者提供混合式自学和讲师主导的研讨会。主题涵盖从 Ansible 101 和编写第一个剧本到使用 Ansible 和 Ansible 301 进行 Terraform。我们提供超过 20 个实验室和研讨会,每个级别的自动化用户都有可供探索的内容。查看我们将在 会议目录 中提供的动手实践内容,了解 AnsibleFest 如何帮助您提升自动化技能。

焦点会议

在芝加哥,我们推出一个新的会议环节,焦点舞台。这些会议将是来自主要 Ansible 客户和合作伙伴的 15 分钟闪电演讲和演示,并将包括一个互动环节,演讲者将在其中回答观众的问题。焦点舞台将直接连接到展厅的 Red Hat Ansible 自动化平台展位,以便所有与会者方便地参与。

实践社区

实践社区是今年 AnsibleFest 中 AnsibleFest 走廊轨道中的一组新的开放论坛。这些是 30 分钟的开放论坛,由 Ansible 专家领导,涵盖一系列多样化的主题。观众将根据他们想从专家那里学到的内容来驱动这些主题的讨论。我们将涵盖的主题包括自动化社区+热情、网络自动化、Ansible 自动化平台、边缘自动化、安全自动化、事件驱动型自动化和云自动化。

向专家提问

随着 AnsibleFest 以线下形式回归,我们很高兴能够重新推出“向专家提问”区域。在这里,您可以与 Ansible 专家进行一对一交流,询问任何关于自动化的迫切问题。我们现在将提供一个更大的空间,为每个专家的专业领域指定区域,帮助您找到适合您问题的正确专家。专家将涵盖广泛的主题,包括产品组件和功能、迁移,以及特定用例主题,如边缘、网络和事件驱动型自动化。










使用 Ansible 管理 VMware 模板生命周期

使用 Ansible 管理 VMware 模板生命周期

当我们管理大量虚拟机 (VM) 时,我们希望减少它们之间的差异并创建一个标准模板。通过使用标准模板,管理和在不同节点上传播相同的操作变得更容易。在使用 VMware vSphere 时,使用标准化的 VM 模板并将其用于创建新的 VM 是一种常见做法。该模板通常被称为黄金映像。它的创建涉及一系列步骤,这些步骤可以使用 Ansible 自动化。在本博文中,我们将了解如何创建和使用新的黄金映像。

准备黄金映像

screenshot

我们使用 映像构建器 来准备新的映像。该工具提供了一个用户界面,允许用户定义自定义映像。在本例中,我们包含 SSH 服务器和 tmux。结果映像是 VMDK4 格式的文件,VMware vSphere 7 不完全支持它,这就是我们使用 .vmdk-4 后缀的原因。

create image ui screenshot

我们使用 uri 模块上传映像。使用这种方法上传大型文件速度相当慢。如果可以,您可能希望将文件直接放到数据存储区(例如:NFS/CIFS)。以下示例假设数据存储区名为 rw_datastore,数据中心名称为 my_dc。以下剧本摘录展示了我们如何上传映像。

- name: Upload from contents of remote file
  ansible.builtin.uri:
    force_basic_auth: true
    url: 'https://vcenter.test/folder/my-vmdk/my-golden-image.vmdk-4?dcPath=my_dc&dsName=rw_datastore'
    url_username: '{{ lookup("ansible.builtin.env", "VMWARE_USER") }}'
    url_password: '{{ lookup("ansible.builtin.env", "VMWARE_PASSWORD") }}'
    method: PUT
    status_code: 201
    src: my-golden-image.vmdk-4
    validate_certs: false
    follow_redirects: yes

现在我们已经上传了文件,我们将将其转换为最新的 VMDK 文件。为此,我们使用 vmkfstools。该工具默认情况下在 ESXi7 主机上可用。在下面的任务中,我们使用 delegate_to: esxi1.test 在我们的其中一个主机上运行命令。

- name: Convert the image in an up to date VMDK format
  ansible.builtin.command: "vmkfstools -i /vmfs/volumes/rw_datastore/my-vmdk/my-golden-image.vmdk-4.vmdk-4   /vmfs/volumes/rw_datastore/my-vmdk/my-golden-image.vmdk -d thin"
  delegate_to: esxi1.test
  vars:
      ansible_user: root
      ansible_python_interpreter: /bin/python3

准备黄金 VM

在此阶段,磁盘已准备就绪,我们可以将其连接到 VM。

- name: Create a VM
  vmware.vmware_rest.vcenter_vm:
    placement:
      cluster: ""
      datastore: ""
      folder: ""
      resource_pool: ""
    name: my-golden-vm
    guest_OS: RHEL_7_64
    hardware_version: VMX_11
    memory:
      hot_add_enabled: true
      size_MiB: 1024
    disks:
      - type: SATA
        backing:
          type: VMDK_FILE
          vmdk_file: "[rw_datastore] my-vmdk/my-golden-image.vmdk"
    cdroms:
      - type: SATA
        sata:
          bus: 0
          unit: 2
    nics:
      - backing:
          type: STANDARD_PORTGROUP
          network: ""
  register: my_vm

有四种不同的方法可以使用 Ansible 的 vmware.vmware_rest 集合克隆 VM。本文解释了它们之间的区别以及如何在 Ansible 中使用它们。

克隆 VM

当我们克隆 VM 时,我们创建了原始 VM 的副本。但是,原始 VM 仍然可以发展,从同一 VM 克隆的第二个副本可能不同。不能保证两个副本将基于完全相同的映像。

vmware.vmware_rest.vcenter_vm 模块允许我们准备即时克隆或常规克隆。

即时克隆

根据 VMware 官方文档,即时克隆是正在运行的 VM 的轻量级副本。它与原始 VM 共享内存块。这就是为什么必须先运行原始 VM 才能克隆它。

- name: Turn the power on the VM on, since it's are pre-condition for Instant Clone
  vmware.vmware_rest.vcenter_vm_power:
    state: start
    vm: '{{ my_vm.id }}'

- name: Wait until my VM is ready
  vmware.vmware_rest.vcenter_vm_tools_info:
    vm: '{{ my_vm.id }}'
  register: vm_tools_info
  until:
  - vm_tools_info is not failed
  - vm_tools_info.value.run_state == "RUNNING"
  retries: 10
  delay: 5

现在我们已经启动并运行了 VM,我们可以对其进行即时克隆

- name: Create an instant clone of a VM
  vmware.vmware_rest.vcenter_vm:
    placement:
      datastore: "{{ lookup('vmware.vmware_rest.datastore_moid', '/my_dc/datastore/local') }}"
      folder: "{{ lookup('vmware.vmware_rest.folder_moid', '/my_dc/vm') }}"
      resource_pool: "{{ lookup('vmware.vmware_rest.resource_pool_moid', '/my_dc/host/my_cluster/Resources') }}"
    state: instant_clone
    source: "{{ my_vm.id }}"
    name: instant_clone_1

常规克隆

我们也可以 克隆现有 VM。如果 VM 带有大型磁盘,此操作需要更长的时间,最多几小时。此操作将创建原始 VM 的完整副本。这次,原始 VM 不需要运行。

- name: Create a full clone of a VM
  vmware.vmware_rest.vcenter_vm:
    placement:
      datastore: "{{ lookup('vmware.vmware_rest.datastore_moid', '/my_dc/datastore/local') }}"
      folder: "{{ lookup('vmware.vmware_rest.folder_moid', '/my_dc/vm') }}"
      resource_pool: "{{ lookup('vmware.vmware_rest.resource_pool_moid', '/my_dc/host/my_cluster/Resources') }}"
    state: clone
    source: "{{ my_vm.id }}"
    name: full_clone_1

构建模板

与克隆不同,模板可以确保 VM 从静态 VM 映像继承。vmware.vmware_rest 集合使我们能够准备 OVF 包,并且从 2.2.0 版本开始,我们还可以准备模板 VM。

将 VM 导出为内容库上的 OVF 包

我们可以将 VM 导出为 OVF 包并将包上传到内容库。如果您想准备将在 vSphere 基础设施中重复使用的标准模板,这将非常方便。此外,OVF 包可以从一个 vSphere 下载并重新上传到另一个 vSphere 中。

在本例中,我们使用 Ansible 来准备 OVF 包。在本例中,my_vm 正在运行,内容库名为 my_library_on_nfs

- name: List all Local Content Library
  vmware.vmware_rest.content_locallibrary_info:
  register: all_content_libraries

- name: Use the name to identify the right Content Library
  set_fact:
    nfs_lib: "{{ all_content_libraries.value | selectattr('name', 'equalto', 'my_library_on_nfs')|first }}"

- name: Export the VM as an OVF on the library
  vmware.vmware_rest.vcenter_ovf_libraryitem:
    session_timeout: 2900
    source:
      type: VirtualMachine
      id: "{{ my_vm.id }}"
    target:
      library_id: "{{ nfs_lib.id }}"
    create_spec:
      name: golden_image
      description: an OVF example
      flags: []
    state: present

vsphere client screenshot

要基于此 OVF 包生成新的 VM,您首先需要在内容库中识别其项目条目。

- name: Get the list of items of the NFS library
  vmware.vmware_rest.content_library_item_info:
    library_id: '{{ nfs_lib.id }}'
    register: lib_items
- name: Define a new fact with the golden image ID
  ansible.builtin.set_fact:
    golden_image_id: '{{ (lib_items.value|selectattr("name", "equalto", "golden_image")|first).id }}'

获得项目 ID 后,我们可以调用 vcenter_ovf_libraryitem 来生成新的 VM。由于 ID 是不可变的,因此我们可以将其保存以备将来使用。

- name: Create a new VM based on the OVF
  vmware.vmware_rest.vcenter_ovf_libraryitem:
    ovf_library_item_id: '{{ golden_image_id }}'
    state: deploy
    target: resource_pool_id: "{{ lookup('vmware.vmware_rest.resource_pool_moid', '/my_dc/host/my_cluster/Resources') }}"
    deployment_spec:
      name: my_vm_from_ovf
      accept_all_EULA: true
      storage_provisioning: thin

将 VM 导出为内容库上的 VM 模板

模板创建使用 vmware.vmware_rest.vcenter_vmtemplate_libraryitems 模块的一次调用完成。此模块在 vmware_rest 集合 2.2.0 中引入。

在这里,nfs_lib 是您的内容库,您的 VM 详细信息已注册在 my_vm 变量中。

- name: Create a VM template on the library
  vmware.vmware_rest.vcenter_vmtemplate_libraryitems:
    name: golden-template
    library: "{{ nfs_lib.id }}"
    source_vm: "{{ my_vm.id }}"
    placement:
      cluster: "{{ lookup('vmware.vmware_rest.cluster_moid', '/my_dc/host/my_cluster') }}"
      folder: "{{ lookup('vmware.vmware_rest.folder_moid', '/my_dc/vm') }}"
      resource_pool: "{{ lookup('vmware.vmware_rest.resource_pool_moid', '/my_dc/host/my_cluster/Resources') }}"

vsphere client screenshot

要基于此模板生成新的 VM,我们再次需要识别内容库中的项目。

- name: Get the list of items of the NFS library
  vmware.vmware_rest.content_library_item_info:
    library_id: '{{ nfs_lib.id }}'
  register: lib_items

- name: Use the name to identify the item
  set_fact:
    my_template_item: "{{ lib_items.value | selectattr('name', 'equalto', 'golden-template')|first }}"

我们使用相同的模块进行部署

- name: Deploy a new VM based on the template
  vmware.vmware_rest.vcenter_vmtemplate_libraryitems:
    name: vm-from-template
    library: "{{ nfs_lib.id }}"
    template_library_item: "{{ my_template_item.id }}"
    placement:
      cluster: "{{ lookup('vmware.vmware_rest.cluster_moid', '/my_dc/host/my_cluster') }}"
      folder: "{{ lookup('vmware.vmware_rest.folder_moid', '/my_dc/vm') }}"
      resource_pool: "{{ lookup('vmware.vmware_rest.resource_pool_moid', '/my_dc/host/my_cluster/Resources') }}"
    state: deploy

总之,只需几个 Ansible 任务,我们就可以将现有 VM 提升为模板。这使我们能够依赖 Ansible 来自动化我们的 VM 模板维护并确保流程的可重复性。