《OpenShift / RHEL / DevSecOps 汇总目录》
说明:本文已经在支持 OpenShift 4.12 的 OpenShift 环境中验证
本文所用到的运行环境和配置方法请先参照以下 blog 准备:
- 《OpenShift 4 - 安装部署 Ansible Automation Platform 4.x 控制台》
- 《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 流水线
- 确认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
- 运行 Pipeline 流水线并指定参数,其中 INVENTORY_ID 为前面创建的 Ansible 主机清单对应的 ID。确认 Pipeline 流水线可正常运行完。
在 AAP 控制台验证创建的 VM 可访问
- 在 Ansible Automation Platform 控制台进入 VM Inventory 清单的主机列表。确认上一步通过 CI/CD Pipeline 流水线创建的 Fedora VM 已经在主机列表中了。
- 选中该主机,然后点击“运行命令”。
- 选中 ping 模块
- 选中 Default execution environment 执行环境
- 选中 fedora-vm-credential 机器凭证。
- 确认运行 SUCCESS。