OpenShift 4 - 使用 Ansible Automation Platform 自动纳管 OpenShift Virtualization 虚机(附视频)

OpenShift / RHEL / DevSecOps 汇总目录
说明:本文已经在支持 OpenShift 4.12 的 OpenShift 环境中验证

本文所用到的运行环境和配置方法请先参照以下 blog 准备:

  1. OpenShift 4 - 安装部署 Ansible Automation Platform 4.x 控制台
  2. OpenShift 4 - 在 CI/CD Pipeline 中创建 KubeVirt 容器虚拟机 - 方法1+2

准备 Ansible Automation Platform(AAP)环境

创建访问VM主机的私钥

在 AAP 控制台中创建一个名为 fedora-vm-credential 的凭证,用户名设为 fedora,并提供SSH 私钥(该SSH 私钥是由《OpenShift 4 - 通过 SSH 访问 OpenShift Virtualization 的虚拟机》中 “创建使用证书登陆的 VM” 生成)
在这里插入图片描述

创建 Inventory 主机清单

在 AAP 控制台中创建一个名为 VM Inventory 新的清单,本文后面创建的 VM 都放在这个清单中。
然后可以先在该清单中任意创建一个测试用的主机。

使用 APP 的 API 向清单中添加主机

使用 https://<AAP-CONTROLLER>/api/v2/hosts/ 地址访问 AAP 的 Host 主机 API,可在下图界面中可以看到上一步的测试主机所在 Inventory 的 ID 为 2。
在这里插入图片描述
另外可在该页面下方的 POST 区域测试增加 Host 主机的 json 脚本。
在这里插入图片描述

配置运行 CI/CD Pipeline 流水线

增加 CI/CD Pipeline 流水线参数

打开《OpenShift 4 - 在 CI/CD Pipeline 中创建 KubeVirt 容器虚拟机 - 方法1+2》一文由方法 2 创建的名为 create-vm-from-template-pipeline 的 CI/CD pipeline 流水线,增加 4 个参数,分别为:AAP_USER、AAP_PASSWORD、AAP_ADDRESS、INVENTORY_ID,分别对应 Ansible Automation Platform 的用户名、密码、控制台访问地址和主机所添加的清单 ID。
在这里插入图片描述

增加调用 AAP API 的 Task

编辑 create-vm-from-template-pipeline 管道流水线,在第 2 个 Task 后增加一个新的 Task,然后选中名为 openshift-client 任务,将其添加到 CI/CD Pipeline 流水线中。
在这里插入图片描述
将以下内容填入任务的 SCRIPT 区域(见下图)。该脚本将根据 vmName 先获得访问地址,然后再调用 API 在 Ansible Automation Platform 中创建一个新的 Host 主机。

VM_IP=$(oc get vmi $(params.vmName) --output=jsonpath={.status.interfaces[0].ipAddress})
curl -k -L -X POST https://$(params.AAP_ADDRESS)/api/v2/hosts/ \
     -u $(params.AAP_USER):$(params.AAP_PASSWORD) \
     -H 'Content-Type: application/json' \
     -d '{"name": "'$(params.vmName)'", "description": "", "inventory": '$(params.INVENTORY_ID)', "enabled": true, "instance_id": "", "variables": "{\"ansible_host\":\"'${VM_IP}'\"}"}'

在这里插入图片描述

运行 CICD Pipeline 流水线

  1. 确认CI/CD Pipeline 流水线为以下 YAML,请用自己环境替换 AAP_USER、AAP_PASSWORD、AAP_ADDRESS、INVENTORY_ID 参数缺省值。
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: create-vm-from-template-pipeline
spec:
  params:
    - description: VM Name
      name: vmName
      type: string
    - default: password
      description: Password for user fedora
      name: vmPassword
      type: string
    - default: fedora-vm-public-key
      name: publicKeySecret
      type: string
    - default: fedora-vm-private-key
      name: privateKeySecret
      type: string
    - default: admin
      name: AAP_USER
      type: string
    - default: 4k4oEtFL8DpU5J5rVrcxrviWQ8SK8Fi9
      name: AAP_PASSWORD
      type: string
    - default: example-aap.apps.8xdrg.dynamic.opentlc.com
      name: AAP_ADDRESS
      type: string
    - name: INVENTORY_ID
      type: string
  tasks:
    - name: create-vm-from-template
      params:
        - name: templateName
          value: vm-template-fedora36
        - name: templateParams
          value:
            - 'NAME:$(params.vmName)'
            - 'PASSWORD:$(params.vmPassword)'
            - 'PUBLIC_KEY_SECRET:$(params.publicKeySecret)'
        - name: dataVolumes
          value: []
        - name: ownDataVolumes
          value: []
        - name: persistentVolumeClaims
          value: []
        - name: ownPersistentVolumeClaims
          value: []
      taskRef:
        kind: Task
        name: create-vm-from-template
    - name: execute-in-vm
      params:
        - name: vmName
          value: $(params.vmName)
        - name: secretName
          value: $(params.privateKeySecret)
        - name: command
          value: []
        - name: args
          value: []
        - name: script
          value: |-
            #!/usr/bin/env bash
            set -ex
            sudo yum install -y nginx
            sudo systemctl enable --now nginx
            echo helloworld > hello.html
            sudo cp hello.html /usr/share/nginx/html/hello.html
            curl localhost/hello.html
      runAfter:
        - create-vm-from-template
      taskRef:
        kind: Task
        name: execute-in-vm
    - name: ansible-manage-vm
      params:
        - name: SCRIPT
          value: >-

            VM_IP=$(oc get vmi $(params.vmName) --output=jsonpath={.status.interfaces[0].ipAddress})

            curl -k -L -X POST https://$(params.AAP_ADDRESS)/api/v2/hosts/ \
              -u $(params.AAP_USER):$(params.AAP_PASSWORD) \
              -H 'Content-Type: application/json' \
              -d '{"name": "'$(params.vmName)'", "description": "", "inventory": '$(params.INVENTORY_ID)', "enabled": true, "instance_id": "", "variables": "{\"ansible_host\":\"'${VM_IP}'\"}"}'
        - name: VERSION
          value: latest
      runAfter:
        - execute-in-vm
      taskRef:
        kind: ClusterTask
        name: openshift-client
  1. 运行 Pipeline 流水线并指定参数,其中 INVENTORY_ID 为前面创建的 Ansible 主机清单对应的 ID。确认 Pipeline 流水线可正常运行完。
    在这里插入图片描述

在 AAP 控制台验证创建的 VM 可访问

  1. 在 Ansible Automation Platform 控制台进入 VM Inventory 清单的主机列表。确认上一步通过 CI/CD Pipeline 流水线创建的 Fedora VM 已经在主机列表中了。
  2. 选中该主机,然后点击“运行命令”。
    在这里插入图片描述
  3. 选中 ping 模块
    在这里插入图片描述
  4. 选中 Default execution environment 执行环境
    在这里插入图片描述
  5. 选中 fedora-vm-credential 机器凭证。
    在这里插入图片描述
  6. 确认运行 SUCCESS。
    在这里插入图片描述

视频

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值