solution/solution-ARMS-Grafana-integrate-Zabbix-Prometheus/main.tf (222 lines of code) (raw):
#设置变量
variable "region" {
default = "cn-qingdao"
}
variable "instance_name" {
default = "deploying-zabbix-server"
}
variable "instance_type" {
default = "ecs.c6.large"
}
variable "image_id" {
default = "centos_7_9_x64_20G_alibase_20240628.vhd"
}
variable "internet_bandwidth" {
default = "10"
}
variable "instance_password" {
default = "Test@12345"
}
variable "mysql_zabbix_password" {
default = "zabbix"
}
provider "alicloud" {
region = var.region
}
data "alicloud_zones" "default" {
available_disk_category = "cloud_efficiency"
available_resource_creation = "VSwitch"
available_instance_type = var.instance_type
}
resource "alicloud_vpc" "vpc" {
vpc_name = var.instance_name
cidr_block = "172.16.0.0/12"
}
resource "alicloud_vswitch" "vsw" {
vpc_id = alicloud_vpc.vpc.id
cidr_block = "172.16.0.0/21"
zone_id = data.alicloud_zones.default.zones.0.id
}
resource "alicloud_security_group" "default" {
name = var.instance_name
vpc_id = alicloud_vpc.vpc.id
}
resource "alicloud_instance" "instance" {
availability_zone = data.alicloud_zones.default.zones.0.id
security_groups = alicloud_security_group.default.*.id
password = var.instance_password
instance_type = var.instance_type
system_disk_category = "cloud_efficiency"
image_id = var.image_id
instance_name = var.instance_name
vswitch_id = alicloud_vswitch.vsw.id
internet_max_bandwidth_out = var.internet_bandwidth
}
resource "alicloud_security_group_rule" "allow_tcp_22" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "22/22"
priority = 1
security_group_id = alicloud_security_group.default.id
cidr_ip = "0.0.0.0/0"
}
resource "alicloud_security_group_rule" "allow_tcp_80" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "80/80"
priority = 1
security_group_id = alicloud_security_group.default.id
cidr_ip = "0.0.0.0/0"
}
resource "alicloud_security_group_rule" "allow_tcp_10050" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "10050/10050"
priority = 1
security_group_id = alicloud_security_group.default.id
cidr_ip = "0.0.0.0/0"
}
# deploy zabbix server
resource "null_resource" "deploy" {
triggers = {
always_run = "${timestamp()}"
script_hash = sha256("${local.mirrorlist_Adjust}")
}
provisioner "remote-exec" {
connection {
type = "ssh"
user = "root"
password = var.instance_password
host = alicloud_instance.instance.public_ip
}
inline = [
# 1、关闭防火墙,修改主机名
"systemctl disable --now firewalld",
"setenforce 0",
"hostnamectl set-hostname zbx-server",
# 2、获取 zabbix 的下载源
"rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm",
# 3、更换 zabbix.repo 为阿里源,安装zabbix-server-mysql和zabbix-agent
#"cd /etc/yum.repos.d",
"sed -i.bak 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/yum.repos.d/zabbix.repo",
#Centos7使用yum命令失效,报错:Could not retrieve mirrorlist, 通过如下命令添加参数到CentOS-Base.repo中解决。
"echo \"${local.mirrorlist_Adjust}\" >> /etc/yum.repos.d/CentOS-Base.repo",
"yum clean all && yum makecache",
"yum install -y zabbix-server-mysql zabbix-agent",
# 安装SCL(Software Collections),便于后续安装高版本的 php,默认 yum 安装的 php 版本为 5.4,版本过低,zabbix 5.0 版本对 php 版本最低要 7.2.0 版本。SCL 可以使得在同一台机器上使用多个版本的软件,而又不会影响整个系统的依赖环境。软件包会安装在 /etc/opt/rh 目录下。
"yum install -y centos-release-scl",
"yum list centos-release-scl # 应显示可用包",
"rpm -q centos-release-scl # 验证安装结果",
# 4、修改 zabbix-front 前端源,安装 zabbix 前端环境到 scl 环境下
"sed -i.bak 's#enabled=0#enabled=1#' /etc/yum.repos.d/zabbix.repo",
# 安装zabbix前端环境到 scl 环境下
"yum install -y zabbix-web-mysql-scl zabbix-apache-conf-scl",
# 5、安装 zabbix 所需的数据库
"yum install -y mariadb-server mariadb",
#将数据库设置为开机自启,并立即启动
"systemctl enable --now mariadb",
# 6、初始化数据库,添加数据库用户,以及 zabbix 所需的数据库信息
"echo \"${local.mysqlConfig}\" > /tmp/mysqlConfig.sh",
"source /tmp/mysqlConfig.sh",
#查询已安装的zabbix-server-mysql的文件列表,找到 sql.gz 文件的位置
"rpm -ql zabbix-server-mysql",
#导入数据库信息,使用zcat将sql.gz文件导入数据库
"zcat /usr/share/doc/zabbix-server-mysql-*/create.sql.gz | mysql -uroot -pabc123 zabbix",
# 7、修改 zabbix-server 配置文件,修改数据库的密码
#124行,取消注释,指定 zabbix 数据库的密码,DBPassword的值是数据库授权zabbix用户的密码。
"sed -i.bak 's/# DBPassword=/DBPassword=${var.mysql_zabbix_password}/' /etc/zabbix/zabbix_server.conf",
# 8、修改 zabbix 的 php 配置文件,修改时区
"sed -i.bak 's/; php_value\\[date.timezone\\] = Europe\\/Riga/php_value\\[date.timezone\\] = Asia\\/Shanghai/' /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf",
# 9、启动 zabbix 相关服务
"systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm",
"systemctl enable zabbix-server zabbix-agent httpd rh-php72-php-fpm",
"netstat -natp | grep zabbix",
# 10、服务端和客户端都配置时间同步,使用阿里云的时钟源
"yum install -y ntpdate",
"ntpdate -u ntp.aliyun.com",
# 11、服务端安装zabbix-get,方便日后排查
"yum install -y zabbix-get",
"sleep 2"
]
}
}
#Centos7使用yum命令失效,报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误", 通过如下命令添加参数到CentOS-Base.repo中解决。
locals {
mirrorlist_Adjust = <<EOF
[centos-sclo-rh]
name=CentOS-7 - SCLo rh
baseurl=http://vault.centos.org/centos/7/sclo/\$basearch/rh/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
[centos-sclo-sclo]
name=CentOS-7 - SCLo sclo
baseurl=http://vault.centos.org/centos/7/sclo/\$basearch/sclo/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
EOF
}
#初始化数据库,添加数据库用户,以及 zabbix 所需的数据库信息
locals {
mysqlConfig = <<EOF
#!/bin/bash
#6、添加数据库用户,以及 zabbix 所需的数据库信息
mysqladmin -u root password 'abc123'
#设置utf8字符集
mysql -u root -pabc123 -e \"CREATE DATABASE zabbix character set utf8 collate utf8_bin\"
#创建并授权用户,使得zabbix可以访问数据库
mysql -u root -pabc123 -e \"GRANT all ON zabbix.* TO 'zabbix'@'%' IDENTIFIED BY 'zabbix'\"
mysql -u root -pabc123 -e \"GRANT ALL ON zabbix.* TO 'zabbix'@'localhost' IDENTIFIED BY 'zabbix'\"
#刷新权限
mysql -u root -pabc123 -e \"flush privileges\"
mysql -u root -pabc123 -e \"show databases\"
EOF
}
##############################
#新增Zabbix被监控的Agent相关配置
##############################
variable "agent_instance_name" {
default = "zabbix-agent-1"
}
resource "alicloud_instance" "agent_instance" {
availability_zone = data.alicloud_zones.default.zones.0.id
security_groups = alicloud_security_group.default.*.id
password = var.instance_password
instance_type = var.instance_type
system_disk_category = "cloud_efficiency"
image_id = var.image_id
instance_name = var.agent_instance_name
vswitch_id = alicloud_vswitch.vsw.id
internet_max_bandwidth_out = var.internet_bandwidth
}
# deploy zabbix agent
resource "null_resource" "agent_deploy" {
triggers = {
always_run = "${timestamp()}"
#script_hash = sha256("${local.mirrorlist_Adjust}")
}
provisioner "remote-exec" {
connection {
type = "ssh"
user = "root"
password = var.instance_password
host = alicloud_instance.agent_instance.public_ip
}
inline = [
# 1、关闭防火墙,修改主机名
"systemctl disable --now firewalld",
"setenforce 0",
"hostnamectl set-hostname zbx-agent01",
# 2、服务端和客户端都配置时间同步,使用阿里云的时钟源
"yum install -y ntpdate",
"ntpdate -u ntp.aliyun.com",
#3、客户端配置时区,与服务器保持一致
"mv /etc/localtime{,.bak}",
"ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime",
"date",
# 4、设置 zabbix 的下载源,安装 zabbix-agent2
"rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm",
"cd /etc/yum.repos.d",
"sed -i 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/yum.repos.d/zabbix.repo",
"yum install -y zabbix-agent2",
# 5、修改 agent2 配置文件
"sed -i.bak 's/Server=127.0.0.1/Server=${alicloud_instance.instance.private_ip}/' /etc/zabbix/zabbix_agent2.conf",
"sed -i.bak 's/ServerActive=127.0.0.1/Server=${alicloud_instance.instance.private_ip}/' /etc/zabbix/zabbix_agent2.conf",
"sed -i.bak 's/Hostname=Zabbix server/Hostname=zbx-agent01/' /etc/zabbix/zabbix_agent2.conf",
#6、启动 zabbix-agent2
"systemctl start zabbix-agent2",
"systemctl enable zabbix-agent2",
"netstat -natp | grep zabbix",
"sleep 2"
]
}
}
output "zabbix_Server_URL" {
value = format("http://%v/zabbix", alicloud_instance.instance.public_ip)
}
output "zabbix_Server_Private_IP" {
value = format("%v", alicloud_instance.instance.private_ip)
}
output "zabbix_Agent_Private_IP" {
value = format("%v", alicloud_instance.agent_instance.private_ip)
}