产品介绍:
产品概述:
CloudIaC是由云霁科技开发的一个开源项目,该项目提出了『环境即服务』的理念,可以通过组 织、项目、云模板、环境等管理维度,精确的授权用户对环境的管理权限,让用户可以分配不同的角色对不同项目下的不同环境进行管理;同时,CloudIaC将Terraform和Ansible进行了打通,让我们可以在资源创建出来之后自动调用Ansible的playbook来完成应用的自动部署。
功能特性:
功能 | 描述 |
一站式 IaC管理 | 提供远程运行环境来执行“部署”并简化Terraform、Ansible 等 IaC 框架的云部署治理 |
灵活的变量管理 | 支持在多个层级下创建密钥、令牌、云凭证以及其他环境变量,执行云部署可自动从 每个层级继承变量,还可以在需要时对继承的变量进行重新赋值 |
基于角色的访问控制 | 提供精细的RBAC(基于角色的访问控制),您可以通过指定不同角色来控制谁可以应用更改、审批以及设置团队角色和权限 |
部署历史 | 保留每一份云环境部署的历史记录,您可以清楚地了解每一次部署和变更所带来的更 改 |
环境即服务 | 基础设施即代码背后的真正意义并不是简单的实现资源创建和应用部署,而是实现一 种管理机制,允许用户在 CI/CD管道之外创建功能齐全的沙盒环境,用于开发、测试演示等 |
自定义 Pipeline | 通过自定义pipeline,您可以自定义添加步骤到部署流程中,运行任何您想要运行的 内容 |
漂移检测 | 基于IaC的状态管理,可以开启『漂移检测』功能来实现环境资源有带外变更时自动通知,在可预见的情况下您还可以自动触发任务实现自动纠正漂移的资源配置 |
漂移检测 | 基于IaC的状态管理,可以开启『漂移检测』功能来实现环境资源有带外变更时自动通知,在可预见的情况下您还可以自动触发任务实现自动纠正漂移的资源配置 |
安全合规 | 使用开放标准 Open Policy Agent 框架以"策略即代码"的方式进行合规检测,在问题发生之前尽量降低安全风险和错误配置 |
核心优势:
产品优势:
CloudIaC实现了基础设施的“环境即服务”流水线,并可以和K8s容器的应用流水线打通,在部署过程前可前置安全合规检查,在部署过程中可实现审批管理,在资源创建后动态部署应用和弹性伸缩,支持自定义devOps流水线、变更状态漂移检测等企业级功能。
环境即服务:
基础设施即代码背后的真正意义并不是简单的实现资源创建和应用部署,而是实现一种管理机制,允许用户在CI/CD 管道之外创建功能齐全的沙盒环境,用于开发、测试演示等,这称为环境即服务。
沙盒化运行:
环境部署整个流水线都在临时拉起的容器内部进行,部署完成后临时容器即被销毁,确保环境之间的隔离的同时保证安全性。
远程状态管理:
所有环境的状态文件保存在远端而非本地,解决多人协作时代码、状态文件不同步的问题。
动态应用部署:
通过Ansible的动态Inventory,在Terraform创建资源后直接传递动态参数给Playbook,完成动态应用部署。
前置合规检查:
使用IaC方式来进行环境管理,我们可以通过分析代码来进行前置的合规检查,从而在资源创建之前发现环境资源是否存在不合规的情况;CloudIaC集成了OPA(Open Policy Agent)引擎,支持导入编写的自定义合规策略来进行合规检查。
自定义流水线:
在整个部署流程中,您可以在中间任意插入自定义步骤并指定步骤执行内容,您还可以在步骤中引用流程中相关的环境变量,便于您将环境部署流程融入到您的DevOps流水线中。
漂移检测:
由于IaC保持了环境的状态文件,基于该状态文件我们提供了定时的漂移检测功能,您可以在环境的列表和资源展示中方便的了解到环境资源的漂移情况,让带外的环境资源变更无所遁形。
私有化部署场景支持:
对于Terraform来说,使用场景基本聚焦在公有云,而对于企业私有云或混合云的场景来说,如何使用IaC方式来进行管理是一个挑战;CloudIaC提供了本地化的Registry服务,通过在本地管理Providers、Modules,让企业在私有化部署的场景下也可以流畅使用IaC方式来进行环境的管理,同时您也可以在Registry中发布编写好的合规策略,让更多组织或用户可以直接使用您分享的合规策略。
术语解释:
IaC (Infrastructure as Code):
IaC就是基础设施即代码,有时也称为"可编程基础设施",可将基础设施配置视为软件编程。
IaC通过声明式语言配置和管理基础设施,消除了手动配置、更新各个硬件的需要,这就使得基础 设施极具“弹性”,即可重复且可扩展。一个操作人员使用同一组代码,即可部署并管理若干基础设施;IaC带来的优势包括速度提升、成本节约和风险降低。
IaC 的概念是催生DevOps 的框架。运行应用的代码和配置基础设施的代码之间越来越难以区分,这意味着开发人员和运维人员在工作上的共同职责日益增加。
Terraform:
Terraform是一个开源的基础设施即代码自动化工具,该工具使用存储在配置文件中的模型来构建云环境,通过Terraform,您可以自动配置基础设施,实现基础设施模块化,然后自由组合来实现各种云资源构建;Terraform已成为IaC事实上的标准。
Terraform Provider:
Terraform被设计成一个多云基础设施编排工具,可以同时编排各种云平台或是其他基础设施的资 源,其实现多云编排的方法就是Provider插件机制。用户在定义描述基础设施配置时可以指定使用的Provider名称和版本,Terraform在执行部署时将根据指定的Provider来判断将在哪个云平台上创建相应的基础设施。
Terraform Module:
对于编写好的一组基础设施描述文件,如果想创建另一套相同的基础设施,一种方法是将写好的tf 文件复制并粘贴到另一个文件夹,但我们也可以使用更方便的方法来避免复制粘贴,那就是Module。
Module是包含一组基础设施描述的代码文件集合,我们在编写tf文件时可以直接以module的方式进行引用,从而实现代码的复用,通常对于常用基础设施我们都可以抽象成Module,以便于在日常编写tf文件时直接进行引用
Ansible:
Ansible是一个自动化运维工具,可通过该工具的playbook 功能,用配置文件来描述软件应用的部署及状态,从而实现在云端资源构建后的应用自动化部署。
OPA(Open Policy Agent):
OPA是一个开源的通用策略引擎,可以统一整个堆栈的策略执行。CloudIaC中集成了OPA引擎,可通过引入编写的策略代码,实现对基础设施资源的合规检查。
VCS(Version Control System):
VCS(Version Control System,版本控制系统)是指用来记录文件内容变化,以便将来查阅特写版本修订情况的系统,通常用来管理软件编程的代码文件,常见的VCS如:Github、Gitlab、Gitee、Gitea等。
云模板:
Terraform声明的基础设施配置文件,是一组以HCL语言描述的扩展名为.tf 的代码文件,与其他编程语言的代码文件一样,我们可以使用VCS来进行管理,一个环境下的tf描述文件放在一个仓库中进行 管理。
云模板对应的就是VCS中的一个仓库,基于云模板可以进行环境的部署,部署过程就是该环境下的资源创建和应用部署过程。
变量:
变量是用来在环境部署时传递可变参数的一组key/value,在CloudIaC中变量分为Terraform变量和环境变量。
Terraform变量是指tf代码中定义的变量,在实际传递给Terraform执行之前会自动加上TF_VARS_
前缀;
环境变量通常用来传递云平台AK/SK或Region等信息。
资源帐号:
资源帐号是CloudIaC中来用方便管理云平台帐号(AK/SK/Region)的一组环境变量集合。
产品架构:
系统架构:
快速入门:
创建组织和项目:
登录页面:
创建组织:
管理员首次登录CloudIaC,首先需要创建一个组织:
在『系统设置』-『组织设置』中点击『创建组织』
创建项目:
在组织界面中,您可以按不同维度来创建项目,比如按照应用维度、组织维度来进行项目规划都可以
项目创建后,默认切换到该项目
集成vcs:
添加VCS:
CloudIaC中所有基础设施描述以及合规策略的代码都通过VCS(版本控制系统)进行管理,所以在创建组织后第一件事就是添加VCS集成,以便在创建云模板或合规策略时进行引用。
在『组织设定』-『VCS』页面选择『添加VCS』来添加集成
注:请确保您的token对应的帐号至少拥有对相应代码仓库的读取权限,如果您后续需要开启CI相关功能,还需要具有设置相应代码仓库webhook的权限
创建云模板:
新建云模板:
1. 进入『组织设置』-『云模板』页面并选择『新建云模板』
基础设置:
在『基础设置』步骤输入云模板名称、描述,点击下一步
选择VCS仓库:
进入『选择仓库』步骤,选择版本控制系统(VCS),然后在仓库列表中选择目标仓库,选择分支或Tag
设置变量:
在『变量设置』步骤中,设置部署时需要传递的变量,您可以通过Terraform变量中的『导入』按 钮来选择导入variables.tf中定义的变量,也可以选择代码仓库中预定义的tfvars文件,如果您需要使用ansible来部署应用,可以在其他变量中选择相应的playbook文件
部署环境:
发起部署:
进入『项目信息』-『云模板』页面,可以看到与该项目关联的云模板,选择相应的云模板,点击『部署』即可发起环境部署操作
设置变量:
在环境部署页面中,可以看到云模板定义的变量以及组织、项目下定义的变量,您可以对继承的变量进行重新赋值,也可以添加新的变量
高级设置:
输入环境名称,点击页面下方的『执行部署』即可发起环境的部署,如需对环境做更多设置可在『高级设置』中进行
部署日志:
通过『部署日志』,您可以实时查看部署时的详细日志,了解部署实时进展,对于有资源变更的任务,将会在『计划预览』后进入待审批状态,管理员审批通过后即可继续部署
产品部署:
容器化部署:
安装并启动docker
curl -fsSL https://get.docker.com | bash -s docker && \
systemctl enable docker && \
systemctl start docker
安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker- compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose && \
chmod +x /usr/local/bin/docker-compose
创建部署目录
部署目录固定为/usr/yunji/cloudiac,不可更改,更改部署目录会导致执行部署任务失败。
mkdir -p /usr/yunji/cloudiac/var/{consul,mysql} && cd /usr/yunji/cloudiac/
编写docker-compose.yml文件
文件路径/usr/yunji/cloudiac/docker-compose.yml,内容如下:
# auto-replace-from: docker/docker-compose.yml version: "3.2"
services:
iac-portal:
container_name: iac-portal
image: "cloudiac/iac-portal:v0.8.1" volumes:
- type: bind
source: /usr/yunji/cloudiac/var
target: /usr/yunji/cloudiac/var
- type: bind
source: /usr/yunji/cloudiac/.env target: /usr/yunji/cloudiac/.env
ports:
- "9030:9030"
depends_on:
-mysql
-consul restart: always
ct-runner:
container_name: ct-runner
image: "cloudiac/ct-runner:v0.8.1" volumes:
-type: bind
source: /usr/yunji/cloudiac/var target: /usr/yunji/cloudiac/var
-type: bind
source: /usr/yunji/cloudiac/.env target: /usr/yunji/cloudiac/.env
-type: bind
source: /var/run/docker.sock target: /var/run/docker.sock
ports:
- "19030:19030"
depends_on:
-consul restart: always
ct-worker:
image: "cloudiac/ct-worker:v0.8.1" container_name: "ct-worker-say-hi"
# 添加该服务只是为了自动 pull 镜像,并不需要后台运行
command: ["echo", "hello world!"] restart: "no"
iac-web:
container_name: iac-web
image: "cloudiac/iac-web:v0.8.0" ports:
- 80:80
restart: always depends_on:
-iac-portal
mysql:
container_name: mysql image: "mysql:8.0" command: [
"--character-set-server=utf8mb4",
"--collation-server=utf8mb4_unicode_ci", "--
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_S UBSTITUTION"
]
volumes:
type: bind
source: /usr/yunji/cloudiac/var/mysql target: /var/lib/mysql
environment:
-MYSQL_RANDOM_ROOT_PASSWORD=yes
-MYSQL_USER
-MYSQL_PASSWORD
-MYSQL_DATABASE
restart: always
consul:
container_name: consul image: "consul:latest" volumes:
-type: bind
source: /usr/yunji/cloudiac/var/consul target: /consul/data
ports:
- "8500:8500"
command: >
consul agent -server -bootstrap-expect=1 -ui -bind=0.0.0.0
-client=0.0.0.0 -enable-script-checks=true -data-dir=/consul/data restart: always
编写.env 文件
文件路径/usr/yunji/cloudiac/.env,内容如下(请根据注释修改配置):
# auto-replace-from: configs/dotenv.sample
# 平台管理员账号密码(均为必填)
# 该账号密码只在系统初始化时使用,后续修改不影响己创建的账号
IAC_ADMIN_EMAIL="admin@example.com"
# 密码要求长度大于 8 且包含字母、数字、特殊字符
IAC_ADMIN_PASSWORD="wei@1696601822"
# 加密密钥配置(必填)
# 敏感数据使用该密钥进行加密
SECRET_KEY="yunjikeji"
# IaC 对外提供服务的地址(必填), 示例: http://cloudiac.example.com
# 该地址需要带协议(http/https),结尾不可以加 "/"
PORTAL_ADDRESS="39.106.10.133"
# consul 地址(必填),示例: private.host.ip:8500
# 需要配置为机器的内网 ip:port,不可使用 127.0.0.1
CONSUL_ADDRESS="172.29.225.176:8500"
# mysql 配置(必填)
MYSQL_HOST=mysql
MYSQL_PORT=3306
MYSQL_DATABASE=cloudiac
MYSQL_USER=cloudiac
MYSQL_PASSWORD="mysqlpass"
# portal 服务注册信息配置 (均为必填)
## portal 服务的 IP 地址, 容器化部署时无需修改, 手动部署时配置为内网 IP
SERVICE_IP=iac-portal
## portal 服务注册的 id(需要保证唯一)
SERVICE_ID=iac-portal-01
## portal 服务注册的 tags
SERVICE_TAGS="iac-portal;portal-01"
# logger 配置
LOG_DEVEL="debug"
# SMTP 配置(该配置只影响邮件通知的发送,不配置不影响其他功能)
SMTP_ADDRESS=smtp.example.com:25
SMTP_USERNAME=user@example.com
SMTP_PASSWORD=""
SMTP_FROM_NAME=IaC
SMTP_FROM=support@example.com
# KAFKA配置(kafka 任务结果回调使用,不配置不影响其他功能)
KAFKA_TOPIC="IAC_TASK_REPLY"
KAFKA_GROUP_ID=""
KAFKA_PARTITION=0
## example: KAFKA_BROKERS: ["kafka.example.com:9092", "..."]
KAFKA_BROKERS=[]
KAFKA_SASL_USERNAME=""
KAFKA_SASL_PASSWORD=""
######### 以下为 runner 配置 #############
# runner 服务注册配置(均为必填)
## runner 服务的 IP 地址, 容器化部署时无需修改, 手动部署时配置为内网 IP
RUNNER_SERVICE_IP=ct-runner
## runner 服务注册的 id(需要保证唯一)
RUNNER_SERVICE_ID=ct-runner-01
RUNNER_SERVICE_TAGS="ct-runner;runner-01"
## 是否开启 offline mode,默认为 false
RUNNER_OFFLINE_MODE="false"
通过.env 可以配置大部分参数,需要更详细的配置可以拷贝镜像里的config-portal.yml 和config- runner.yml 文件,修改后再挂载到容器中进行替换
启动docker-compose
docker-compose up -d
# 前台调试启动:
# dokcker-compose up
至此服务部署完成
容器运行成功
登录成功
产品使用感受:
因为之前没有用过类似的产品,没有具体可对比性,给我最大的感受是它把资源都整合在一台机器上,需要什么资源可以划分出来
随着云计算的到来,在很大程度上帮我们解决了上述的部分问题,通过云计算,我们甚至无需构建和维护自己的数据中心即可让我们的应用运行起来。但它对解决不一致问题没有任何帮助。而Iac解决了这一问题。
IaC(Infrastructure as code 基础设施即代码)通过使用配置文件来管理所有的基础设施并自动化基础架构管理。
使用基础设施即代码,我们的基础设施配置会采用代码文件的形式。由于它只是文本,因此可以轻松编辑、复制和分发它。我们可以使用VCS(版本控制系统)来管理配置文件,就像管理任何其他源代码文件一样。
优点很多:易于复制/易于销毁/易于查看/易于分享
界面简洁易懂,操作容易上手,官方文档很详细,能对云环境进行有秩序、高效的管理,还有很多功能需要进一步学习和摸索…
最优之处:
官方文档和新手指南写的非常全面,通俗易懂,图文结合,给用户带来了非常便捷的了解以及部署和使用。可能由于产品的更新以及功能的全面,有的地方可能文档中截图缺失但基本不影响整个产品的运行。为编写文档的前辈点个赞!