Skip to content

Instantly share code, notes, and snippets.

@akira345
Last active June 14, 2023 15:44
Show Gist options
  • Save akira345/f324289af4fd0d204dd42fab09c308ab to your computer and use it in GitHub Desktop.
Save akira345/f324289af4fd0d204dd42fab09c308ab to your computer and use it in GitHub Desktop.
zabbix-serverを構築するdocker-compose.ymlサンプル。パスワードとかは適当に変えること。docker-proxyを使用しています。
# -*- coding: utf-8 -*-
#
require 'file-tail'
require 'systemu'
# DockerホストをゲストのZabbixServerコンテナで監視する場合、サーバ再起動時やDocker再起動時IPが変わってしまい、Agentの接続が蹴られてしまいます。
# 本スクリプトは、DockerホストのZabbixAgentのログを監視し、接続拒否されたIPを正しいIPに修正してAgentを再起動します。
# RootユーザのCronに以下のように設定して、サーバ再起動時に起動、常駐するようにします。
#
# @reboot /usr/bin/ruby /opt/foo/docker/zabbix/chg_agent_ip.rb >> /opt/foo/docker/zabbix/chgip.log
# 本スクリプトは、file-tailとsystemuのGemが必要です。別途インストールしてください。
#
# 検証環境
# Ubuntu 18.04.2
# Ruby 2.5.1p57
#
ZABBIX_AGENT_LOG = "/var/log/zabbix/zabbix_agentd.log"
ZABBIX_AGENT_CONF = "/etc/zabbix/zabbix_agentd.conf"
MATCH_KEY = " \\d{1,}:\\d{1,}:\\d{1,}\\.\\d{1,} failed to accept an incoming connection: connection from \"(\\d{1,}\\.\\d{1,}\\.\\d{1,}\\.\\d{1,})\" rejected, allowed hosts: \"(\\d{1,}\\.\\d{1,}\\.\\d{1,}\\.\\d{1,})\""
def chg_ip_and_restart_zabbix_agent(before_ip,after_ip)
puts "exec cmd : "
cmd = "/bin/sed -i -e \"s/#{before_ip}/#{after_ip}/g\" #{ZABBIX_AGENT_CONF}"
puts cmd
status, stdout, stderr = systemu cmd
puts [status,stdout,stderr]
cmd = "/bin/systemctl restart zabbix-agent.service"
puts cmd
status, stdout, stderr = systemu cmd
puts [status,stdout,stderr]
puts "end"
end
@before_ip = nil
@after_ip = nil
class ACCESS_DENY < StandardError; end
def chk_logfile
begin
File.open(ZABBIX_AGENT_LOG) do |log|
log.extend(File::Tail)
log.interval = 1
log.backward(0)
log.tail do |line|
puts line
if ip = line.match(/#{MATCH_KEY}/)
puts "match!"
@before_ip = ip[2]
@after_ip = ip[1]
puts "before_ip:#{@before_ip} after_ip:#{@after_ip}"
raise ACCESS_DENY
end
end
end
rescue Errno::EACCES
puts "Need to run ROOT User!"
rescue ACCESS_DENY
chg_ip_and_restart_zabbix_agent(@before_ip,@after_ip)
chk_logfile
end
end
# main
chk_logfile
#/bin/bash
#
# Cronで動かすときはPATHを設定すること。
#
get_contenner_service_name(){
echo $1 | cut -d"_" -f2- | rev | cut -c 3- | rev
}
mysql_contenner_backup(){
target_contenner=$1
mysql_contenner_service_name=`get_contenner_service_name ${target_contenner}`
mysql_dump_name=${mysql_contenner_service_name}_dumpall.sql
echo "MySQLバックアップ開始:${mysql_contenner_service_name}"
docker exec -i ${target_contenner} /bin/sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > ${backup_dir}/${mysql_dump_name}
if [ $? -ne 0 -o ! -e ${backup_dir}/${mysql_dump_name} -o ! -s ${backup_dir}/${mysql_dump_name} ]; then
echo "mysqlバックアップに失敗:${mysql_contenner_service_name}"
exit 1
fi
echo "MySQLバックアップ終了:${mysql_contenner_service_name}"
}
pgsql_contenner_backup(){
target_contenner=$1
pgsql_contenner_service_name=`get_contenner_service_name ${target_contenner}`
pgsql_dump_name=${pgsql_contenner_service_name}_dumpall.sql
echo "PostgreSQLバックアップ開始:${pgsql_contenner_service_name}"
docker exec -i ${target_contenner} /bin/sh -c 'pg_dumpall -U $POSTGRES_USER' > ${backup_dir}/${pgsql_dump_name}
if [ $? -ne 0 -o ! -e ${backup_dir}/${pgsql_dump_name} -o ! -s ${backup_dir}/${pgsql_dump_name} ]; then
echo "postgresqlバックアップに失敗:${pgsql_contenner_service_name}"
exit 1
fi
echo "PostgreSQLバックアップ終了:${pgsql_contenner_service_name}"
}
contenner_backup(){
target_contenner=$1
target_contenner_service_name=`get_contenner_service_name ${target_contenner}`
echo "Dockerコンテナ終了:${target_contenner_service_name}"
docker-compose stop ${target_contenner_service_name}
if [ $? -ne 0 ]; then
echo "Dockerコンテナ終了に失敗:${target_contenner_service_name}"
exit 1
fi
docker run --rm --volumes-from ${target_contenner} -v ${backup_dir}:/backup -e TAR_OPTS="--verbose" akira345/docker-backup backup ${target_contenner}.tar.xz
if [ $? -ne 0 ]; then
echo "Dockerコンテナバックアップに失敗:${target_contenner_serivce_name}"
exit 1
fi
echo "Dockerコンテナ起動:${target_contenner_service_name}"
docker-compose start ${target_contenner_service_name}
}
target_contenners=$(docker-compose ps | tail -n +3 | cut -d " " -f1)
backup_dir=$(pwd)/backup
mkdir -p ${backup_dir}
echo ${target_contenners}
echo "start : `date +'%Y/%m/%d %H:%M:%S'`"
if [ -n "${target_contenners}" ]; then
echo "バックアップ開始"
for target_contenner in ${target_contenners};
do
#PostgreSQL、MySQLコンテナ名に一致するように修正すること
if [[ ${target_contenner} =~ pgsql|postgresql ]]; then
pgsql_contenner_backup ${target_contenner}
elif [[ ${target_contenner} =~ mysql ]]; then
mysql_contenner_backup ${target_contenner}
else
contenner_backup ${target_contenner}
fi
done
echo "END"
fi
echo "end : `date +'%Y/%m/%d %H:%M:%S'`"
exit 0
FROM zabbix/zabbix-web-apache-pgsql:ubuntu-latest
USER root
RUN apt-get clean && apt-get update && \
apt-get -y install fonts-ipafont && \
rm -f /etc/alternatives/zabbix-frontend-font && \
rm -f /usr/share/zabbix/assets/fonts/DejaVuSans.ttf && \
update-alternatives --install /usr/share/zabbix/assets/fonts/DejaVuSans.ttf zabbix-frontend-font /usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf 50 && \
update-alternatives --set zabbix-frontend-font /usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf && \
chown -R www-data:www-data /usr/share/zabbix/assets/ && \
chmod -R 744 /usr/share/zabbix/assets && \
rm -rf /var/lib/apt/lists/*
# DB Version: 13
# OS Type: linux
# DB Type: dw
# Total Memory (RAM): 2 GB
# CPUs num: 2
# Connections num: 100
# Data Storage: ssd
max_connections = 100
shared_buffers = 512MB
effective_cache_size = 1536MB
maintenance_work_mem = 256MB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 500
random_page_cost = 1.1
effective_io_concurrency = 200
work_mem = 2621kB
min_wal_size = 4GB
max_wal_size = 16GB
max_worker_processes = 2
max_parallel_workers_per_gather = 1
max_parallel_workers = 2
max_parallel_maintenance_workers = 1
listen_addresses = '*'
version: '2'
# proxy
services:
proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
restart: always
networks:
default:
external:
name: common_link
version: '2'
volumes:
zabbix_mysql_data:
driver: local
services:
# zabbix_mysql
zabbix_mysql:
restart: always
image: mysql:8
volumes:
- zabbix_mysql_data:/var/lib/mysql
- ./zabbix_mysql/conf:/etc/mysql/conf.d
environment:
MYSQL_ROOT_PASSWORD: passwd
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
MYSQL_DATABASE: zabbix
# zabbix
zabbix-server:
restart: always
image: zabbix/zabbix-server-mysql:latest
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
depends_on:
- zabbix_mysql
environment:
DB_SERVER_HOST: zabbix_mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
ports:
- "10051:10051"
links:
- zabbix_mysql:mysql
zabbix-web:
restart: always
image: zabbix/zabbix-web-apache-mysql:latest
depends_on:
- zabbix-server
- zabbix_mysql
environment:
DB_SERVER_HOST: zabbix_mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
PHP_TZ: Asia/Tokyo
ZBX_SERVER_HOST: zabbix-server
ZBX_SERVER_PORT: 10051
ZBX_SERVER_NAME: zabbix3.example.com
VIRTUAL_HOST: zabbix3.example.com
VIRTUAL_PORT: 80
links:
- zabbix_mysql:mysql
- zabbix-server:zabbix-server
networks:
default:
external:
name: common_link
version: '2'
volumes:
zabbix_pgsql_data:
driver: local
zabbix_server_mib:
driver: local
services:
# zabbix_pgsql
zabbix_pgsql:
restart: always
image: postgres:14
volumes:
- zabbix_pgsql_data:/var/lib/postgresql/data
- ./pgsql.conf:/etc/postgresql/postgresql.conf
environment:
POSTGRES_PASSWORD: passwd
POSTGRES_USER: zabbix
POSTGRES_DB: zabbix
POSTGRES_INITDB_ARGS: --encoding=UTF-8 --locale=C
command: 'postgres -c config_file="/etc/postgresql/postgresql.conf"'
# zabbix
zabbix-server:
restart: always
image: zabbix/zabbix-server-pgsql:latest
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- zabbix_server_mib:/var/lib/zabbix/mibs
depends_on:
- zabbix_pgsql
environment:
DB_SERVER_HOST: zabbix_pgsql
POSTGRES_DB: zabbix
POSTGRES_USER: zabbix
POSTGRES_PASSWORD: passwd
ports:
- "10051:10051"
links:
- zabbix_pgsql:zabbix_pgsql
zabbix-web:
restart: always
image: zabbix/zabbix-web-apache-pgsql:ubuntu-latest
build: .
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/tmezone:ro
depends_on:
- zabbix-server
- zabbix_pgsql
environment:
DB_SERVER_HOST: zabbix_pgsql
POSTGRES_DB: zabbix
POSTGRES_USER: zabbix
POSTGRES_PASSWORD: passwd
PHP_TZ: Asia/Tokyo
ZBX_SERVER_HOST: zabbix-server
# ZBX_SERVER_PORT: 10051
ZBX_SERVER_NAME: zabbix3.example.com
VIRTUAL_HOST: zabbix3.example.com
VIRTUAL_PORT: 80
links:
- zabbix_pgsql:zabbix_pgsql
- zabbix-server:zabbix-server
networks:
default:
external:
name: common_link
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment