图片
创建一个目录,写一个docker-compose
1 | mkdir host
2 | cat docker-compose.yml
内容如下
version: '3.8'
services:
h1:
build: .
image: centos7-sshd
container_name: h1
privileged: true
command: /usr/sbin/init
hostname: h1
networks:
xiuyun_net:
tomcat1:
build: .
image: centos7-sshd
container_name: tomcat1
privileged: true
hostname: tomcat1
command: /usr/sbin/init
networks:
xiuyun_net:
tomcat2:
build: .
image: centos7-sshd
container_name: tomcat2
hostname: tomcat2
privileged: true
command: /usr/sbin/init
networks:
xiuyun_net:
mysql-master:
build: .
image: centos7-sshd
container_name: mysql-master
hostname: mysql-master
privileged: true
command: /usr/sbin/init
networks:
xiuyun_net:
mysql-slave:
build: .
image: centos7-sshd
container_name: mysql-slave
hostname: mysql-slave
privileged: true
command: /usr/sbin/init
networks:
xiuyun_net:
ansible:
build: .
image: centos7-sshd
container_name: ansible
hostname: ansible
privileged: true
command: /usr/sbin/init
networks:
xiuyun_net:
networks:
xiuyun_net:
Dockerfile
1 | cat Dockerfile
FROM centos:7
RUN yum install -y \
vim bash-com* openssh-clients openssh-server iproute cronie;\
yum group install -y "Development Tools";yum clean all;\
localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV LANG=zh_CN.UTF-8
执行完上面的步骤,执行如下命令
1 | docker-compose up -d # 启动进程
2 | docker-compose ps
结果如下图
实施步骤
1.安装ansible
1 | docker-compose exec ansible bash # 进入ansible机器
2 | curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo # 下载epel源
3 | yum -y install ansible # 安装ansible
与其他管理节点建立信任关系
不检查其他主机的公钥
在ansible主机上修改文件 vi /etc/ansible/ansible.cfg
中设置如下选项
继续在ansible主机上执行如下命令,创建自己的密钥对
1 | ssh-keygen -N '' -f ~/.ssh/id_rsa
建立hosts资产清单文件
IP 信息可以通过在 宿主机 上执行如下命令获取
创建一个文件hosts
1 | vim hosts
给管理的机器设置 root 密码
由于这里是使用容器作为虚拟机的,所以默认情况下,root 用户没有密码,需要我们手动设置。
在宿主机上执行如下命令设置密码
1 | docker-compose exec 服务名称 bash -c 'echo 密码 | passwd root --stdin'
1 | docker-compose exec h1 bash -c 'echo 1 | passwd root --stdin'
2 | docker-compose exec tomcat1 bash -c 'echo 1 | passwd root --stdin'
3 | docker-compose exec tomcat2 bash -c 'echo 1 | passwd root --stdin'
4 | docker-compose exec mysql-master bash -c 'echo 1 | passwd root --stdin'
5 | docker-compose exec mysql-slave bash -c 'echo 1| passwd root --stdin'
传输公钥
1 | mkdir playbook # 创建目录
2 | cd playbook
3 | cat send-pubkey.yml
内容如下
---
- hosts: all
# gather_facts: no
remote_user: root
vars_files:
- foo.yml
tasks:
- name: Set authorized key taken from file
authorized_key:
user: root
state: present
key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
...
1 | vim foo.yml
ansible_ssh_pass: 1
执行playbook
ansible-playbook -i hosts send-pubkey.yml
结果图
给另外一台机器安装nginx(在ansible机器上执行操作)
1 | mkdir nginx # 创建目录
2 | vim nginx.repo
内容如下
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
cat nginx/install-nginx.yml
内容如下
---
- hosts: nginx
gather_facts: no
tasks:
- name: copy nginx 仓库文件
copy:
src: ./nginx.repo
dest: /etc/yum.repos.d/nginx.repo
- name: instll nginx
yum:
name: nginx
state: present
- name: start nginx
systemd:
name: nginx
state: started
...
执行playbook
ansible-playbook -i hosts nginx/install-nginx.yml
结果图如下
MySQL (部署两台机器)
2.1 部署Mysql 并启动MySQL服务
1 | mkdir mysql
2 | cd mysql
3 | cat install-mysql.yml
内容如下
---
- name: 安装 mysql,并启动服务
hosts: mysql
gather_facts: no
tasks:
- name: 安装仓库文件
yum:
name: https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
state: present
- name: 禁用 MySQL 8.0 仓库
ini_file:
path: /etc/yum.repos.d/mysql-community.repo
section: mysql80-community
option: enabled
value: '0'
- name: 启用 MySQL 5.7 仓库
ini_file:
path: /etc/yum.repos.d/mysql-community.repo
section: mysql57-community
option: enabled
value: '1'
- name: 安装 mysql 社区版
yum:
name: mysql-community-server
state: present
- name: start mysql
service:
name: mysqld
state: started
...
执行playbook
1 | ansible-playbook -i hosts install-mysql.yml
设置MySQL root 用户的密码
1 | grep password /var/log/mysqld.log # 过滤密码
2 | mysqladmin -uroot -p'过滤出来的密码' password 'taotao123'
创库、创表
创建数据库
create database db default charset utf8mb4 collate utf8mb4_general_ci;
use db;
创建表;
create table db.stu(
id int auto_increment primary key,
name varchar(4),
age int,
phone char(11));
插入数据
insert into stu(name,age,phone) values('王麻子',32,'13141098899'),
('九筒',32,'13721096541'),('六子',18,'13139192657'),('马邦德',37,'15855996688');
查询数据
查询出 年龄大于 18 的学员姓名
select name from db.stu where age > 18;
统计出年龄 大于等于 32 的学员数量
select count(name) from db.stu where age >= 32;
select count(name) 数量 from db.stu where age >= 32;
统计出每个年龄段的学员数量–>需要用到分组查询
select age 年龄,count(age) 数量 from db.stu group by age;
按照数量进行排序
select age 年龄,count(age) 数量 from db.stu group by age order by 数量;
统计出 年龄在 30 到 50 之间的学员信息(id,name,age,phone)
select id,name,name,age,phone from db.stu where age between 30 and 50;
查出年龄是 32 岁,并且电话号是13721096541 的学员姓名
select name from db.stu where age=32 and phone='13721096541';
配置主从复制
修改主服务器的配置
在主服务上操作,设置二进制日志文件信息并开启二进制日志
1 | cat /etc/my.cnf
内容如下
log_bin
server-id=1
gtid_mode=ON
enforce_gtid_consistency=1
第二种
log-bin=/var/log/mysql/mysql-bin
server-id=1
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
创建二进制日志文件路径,并授权
mkdir /var/log/mysql/
chown mysql.mysql /var/log/mysql
重启主服务器的MySQL服务
systemctl restart mysqld
在主服务器上给从库进行授权
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY '密码';
导出主数据库服务器目前的数据(在命令行)
mysqldump -uroot -p'密码' --all-databases --master-data=1 > dbdump.db
将导出的数据传递给从服务器
MySQL的主服务器上执行
scp dbdump.db root@192.168.64.163:/root/
将数据导入到从服务器
在从服务器上操作
假如 从服务器的 root 初始密码没有修改,需要按照上面 master 提到的方法修改一下
在从服务器 /root/ 目录下执行下面的命令
1 | mysql -uroot -p'密码' < dbdump.db
配置从服务器的server-id
编辑 /etc/my.cnf 文件,并添加如下内容
log_bin
server-id=2
gtid_mode=ON
enforce_gtid_consistency=1
重启服务
systemctl restart mysqld
在从数据库上配置主库信息
查看二进制文件的同步信息
grep '^CHANGE' dbdump.db
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=437;
登录到从库停止从库
stop slave
登录到 从库设置连接到主机的信息
CHANGE MASTER TO
MASTER_HOST='192.168.64.162',
MASTER_USER='repl',
MASTER_PASSWORD='密码'
master_auto_position=1;
关闭防火墙和selinux(主数据库和从数据库)
systemctl stop firewalld
setenforce 0 #
从服务器启动 主从复制的进程
start slave;
查看是否成功
红色显示框 表示yes,证明成功
Tomcat
部署JDK 环境
mkdir tomcat
cd tomcat
cat install-jdk.yml
内容如下
---
- name: 部署 JDK 环境
hosts: tomcat
gather_facts: no
remote_user: root
tasks:
- name: 解压 jdk 包到指定目录 /usr/local/
ansible.builtin.unarchive:
src: jdk-8u181.tar.gz
dest: /usr/local/
list_files: yes
register: jdk_dir
- name: 创建软链接,上部解压后的目录是 jdk1.8.0_181
ansible.builtin.file:
src: /usr/local/{{ jdk_dir.files.0 | regex_replace('/.*') }}
dest: /usr/local/java
state: link
- name: 设置环境变量
copy:
src: java.sh
dest: /etc/profile.d/java.sh
- name: 验证是否部署成功
shell: java -version
register: java_version
- name: 输出验证信息
debug:
var: java_version.stderr_lines.0
...
这个yml文件需要的文件
cat java.sh
内容如下
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
jdk数据包
修改包名
mv jdk-8u181-linux-x64.tar jdk-8u181.tar.gz
部署tomcat
- name: 部署 tomcat
hosts: tomcat
gather_facts: no
remote_user: root
tasks:
- name: 解压 tomcat 压缩包到指定目录 /usr/local
ansible.builtin.unarchive:
src: tomcat-8.5.63.tar.gz
dest: /usr/local/
list_files: yes
register: ret
- name: 创建软链接
ansible.builtin.file:
src: /usr/local/{{ ret.files.0 | regex_replace('/.*') }}
dest: /usr/local/tomcat
state: link
- name: 设置环境变量
copy:
src: tomcat.sh
dest: /etc/profile.d/tomcat.sh
- name: 验证是否成功
shell: /usr/local/tomcat/bin/version.sh
register: tomcat_version
- name: 输出执行命令的结果
when: tomcat_version.rc == 0
debug:
msg: "{{ tomcat_version.stdout_lines.0 }}"
需要的文件为:
cat tomcat.sh
内容如下
export TOMCAT_HOME=/usr/local/tomcat/
tomcat数据包
修改包名
mv apache-tomcat-8.5.63.tar tomcat-8.5.63.tar.gz