1、ansible-playbook实现MySQL的二进制部署
环境准备:
源码包:mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
已实现ansible主控端基于key验证
主机清单配置
[root@ansible ansible]#pwd
/data/ansible
[root@ansible ansible]#cat hosts
[webservers]
10.0.0.17
1.1创建mysql角色相关的目录
[root@ansible roles]#pwd
/data/ansible/roles
[root@ansible roles]#mkdir -pv mysql/{tasks,files,vars}
mkdir: created directory ‘mysql’
mkdir: created directory ‘mysql/tasks’
mkdir: created directory ‘mysql/files’
mkdir: created directory ‘mysql/vars’
1.2创建mysql角色相关的文件
[root@ansible mysql]#pwd
/data/ansible/roles/mysql
[root@ansible mysql]#tree
.
├── files
│ ├── my.cnf
│ └── mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
├── tasks
│ ├── config.yml
│ ├── data.yml
│ ├── group.yml
│ ├── install.yml
│ ├── linkfile.yml
│ ├── main.yml
│ ├── path.yml
│ ├── script.yml
│ ├── secure.yml
│ ├── service.yml
│ ├── unarchive.yml
│ └── user.yml
└── vars
└── main.yml
3 directories, 15 files
[root@ansible mysql]#ls files/
my.cnf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
[root@ansible mysql]#vim files/my.cnf
[mysqld]
explicit_defaults_for_timestamp=true
server-id=1
log-bin
datadir=/data/mysql
socket=/data/mysql/mysql.sock
[mysqld_safe]
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
[root@ansible mysql]#vim vars/main.yml
mysql_version: 5.7.36
mysql_file: mysql-{{mysql_version}}-linux-glibc2.12-x86_64.tar.xz
mysql_root_password: 123456
#main.yml 是task的入口文件
[root@ansible mysql]#vim tasks/main.yml
- include: install.yml
- include: group.yml
- include: user.yml
- include: unarchive.yml
- include: linkfile.yml
- include: data.yml
- include: config.yml
- include: script.yml
- include: path.yml
- include: service.yml
- include: secure.yml
[root@ansible mysql]#vim tasks/install.yml
- name: install packages
yum:
name:
- libaio
- numactl-libs
[root@ansible mysql]#vim tasks/group.yml
- name: create mysql group
group: name=mysql gid=306
[root@ansible mysql]#vim tasks/user.yml
- name: create mysql user
user: name=mysql uid=306 group=mysql shell=/sbin/nologin system=yes create_home=no home=/data/mysql
[root@ansible mysql]#vim tasks/unarchive.yml
- name: copy tar to remote host and file mode
unarchive: src=/data/ansible/roles/mysql/files/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz dest=/usr/local/owner=root group=root copy=yes
[root@ansible mysql]#vim tasks/linkfile.yml
- name: create linkfile /usr/local/mysql
file: src=/usr/local/mysql-5.7.36-linux-glibc2.12-x86_64 path=/usr/local/mysql state=link
[root@ansible mysql]#vim tasks/data.yml
- name: data dir
shell: /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=/data/mysql
tags: data
[root@ansible mysql]#vim tasks/config.yml
- name: config my.cnf
copy: src=/data/ansible/roles/mysql/files/my.cnf dest=/etc/my.cnf
[root@ansible mysql]#vim tasks/script.yml
- name: service script
shell: /bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@ansible mysql]#vim tasks/path.yml
- name: PATH variable
copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh
[root@ansible mysql]#vim tasks/service.yml
- name: enable service
shell: chkconfig --add mysqld;/etc/init.d/mysqld start
tags: service
[root@ansible mysql]#vim tasks/secure.yml
- name: change password
shell: /usr/local/mysql/bin/mysqladmin -uroot password {{mysql_root_password}}
1.3、在playbook中调用角色
[root@ansible ansible]#pwd
/data/ansible
[root@ansible ansible]#vim role_mysql.yml
---
- hosts: webservers
remote_user: root
gather_facts: no
roles:
- mysql
1.4、运行playbook
[root@ansible ansible]#ansible-playbook -C role_mysql.yml
[root@ansible ansible]#ansible-playbook role_mysql.yml
[root@ansible ansible]#ansible-playbook role_mysql.yml
PLAY [webservers] ****************************************************************************************************
TASK [mysql : install packages] **************************************************************************************
ok: [10.0.0.17]
TASK [create mysql group] ********************************************************************************************
ok: [10.0.0.17]
TASK [create mysql user] *********************************************************************************************
ok: [10.0.0.17]
TASK [mysql : copy tar to remote host and file mode] *****************************************************************
changed: [10.0.0.17]
TASK [create linkfile /usr/local/mysql] ******************************************************************************
ok: [10.0.0.17]
TASK [mysql : data dir] **********************************************************************************************
changed: [10.0.0.17]
TASK [mysql : config my.cnf] *****************************************************************************************
changed: [10.0.0.17]
TASK [mysql : service script] ****************************************************************************************
changed: [10.0.0.17]
TASK [mysql : PATH variable] *****************************************************************************************
changed: [10.0.0.17]
TASK [mysql : enable service] ****************************************************************************************
changed: [10.0.0.17]
TASK [mysql : change password] ***************************************************************************************
changed: [10.0.0.17]
PLAY RECAP ***********************************************************************************************************
10.0.0.17 : ok=11 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@centos7 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 80 [::]:3306 [::]:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*
[root@centos7 ~]#mysql --version
mysql Ver 14.14 Distrib 5.7.36, for linux-glibc2.12 (x86_64) using EditLine wrapper
[root@centos7 ~]#mysql -uroot -p123456 -Dmysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
2、Ansible playbook实现apache批量部署,并对不同主机提供以各自IP地址为内容的index.html
环境准备:
[root@ansible ~]#mkdir /data/ansible
[root@ansible ansible]#cd /data/ansible/
[root@ansible ansible]#cp /etc/ansible/ansible.cfg .
[root@ansible ansible]#ansible --version
ansible 2.9.27
config file = /data/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
[root@ansible ansible]#vim ansible.cfg
inventory = ./hosts
[root@ansible ansible]#cp /etc/ansible/hosts .
[root@ansible ansible]#cat hosts
[webservers]
10.0.0.17
10.0.0.27
[root@ansible ansible]#ansible webservers -m ping
10.0.0.27 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.0.0.17 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Playbook常见组件:
Hosts:执行的远程主机列表
Tasks:任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括name和task,一个name只能包括一个task
Variables:内置变量或自定义变量在playbook中调用
Templates:模板,可替换模板文件中的变量并实现一些简单逻辑的文件
Handlers和notify结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags:标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
roles各目录作用:
roles/project/:项目名称,有以下子目录
files/:存放由copy或script模块等调用的文件
templates/:template模块查找所需要模板文件的目录
tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
handlers/:至少应该包含一个名为main.yml的文件;此目录下的其它的文件需要在此文件中通过include进行包含
vars/:定义变量,至少应该包含一个名为main.yml的文件;此目录下的其它的变量文件需要在此文件中通过include进行包含
meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含
default/:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低
创建role:
创建role的步骤:
1、创建role的目录结构,在以roles命名的目录下分别创建以各角色名称命名的目录,如mysql等,在每个角色命名的目录中分别创建相关的目录和文件,比如tasks、files、handlers、templates和vars等目录;用不到的目录可以创建为空目录,也可以不创建
2、编写和准备role的功能文件
3、编写playbook文件调用需要的角色应用于指定的主机
1、创建httpd角色相关的目录
[root@ansible ansible]#pwd
/data/ansible
[root@ansible ansible]#mkdir -pv /data/ansible/roles/httpd/{tasks,handlers,files}
2、创建httpd角色相关的文件
[root@ansible ansible]#cd /data/ansible/roles/httpd/
#main.yml 是task的入口文件
[root@ansible httpd]#vim tasks/main.yml
- include: group.yml
- include: user.yml
- include: install.yml
- include: config.yml
- include: index.yml
- include: service.yml
[root@ansible httpd]#vim tasks/group.yml
- name: create apache group
group: name=apache system=yes gid=80
[root@ansible httpd]#vim tasks/user.yml
- name: create apache user
user: name=apache system=yes shell=/sbin/nologin home=/var/www/ uid=80 group=apache
[root@ansible httpd]#vim tasks/install.yml
- name: install httpd package
yum: name=httpd
[root@ansible httpd]#vim tasks/config.yml
- name: config file
copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes
notify: restart
[root@ansible httpd]#vim tasks/index.yml
- name: index.html
copy: src=index.html dest=/var/www/html/
[root@ansible httpd]#vim tasks/service.yml
- name: start service
service: name=httpd state=started enabled=yes
[root@ansible httpd]#vim handlers/main.yml
- name: restart
service: name=httpd state=restarted
3、在files目录下准备两个文件
[root@ansible httpd]#cat files/index.html
<h1> Welcome to http website </h1>
[root@ansible httpd]#cp /etc/httpd/conf/httpd.conf files/httpd.conf
[root@ansible httpd]#ls files/
httpd.conf index.html
[root@ansible httpd]#tree
.
├── files
│ ├── httpd.conf
│ └── index.html
├── handlers
│ └── main.yml
└── tasks
├── config.yml
├── group.yml
├── index.yml
├── install.yml
├── main.yml
├── service.yml
└── user.yml
3 directories, 10 files
4、在playbook中调用角色
[root@ansible httpd]#cd ..
[root@ansible roles]#pwd
/data/ansible/roles
[root@ansible roles]#cd ..
[root@ansible ansible]#pwd
/data/ansible
[root@ansible ansible]#vim /data/ansible/role_httpd.yml
---
# httpd role
- hosts: webservers
remote_user: root
roles:
- httpd
5、运行playbook
[root@ansible ansible]#ansible-playbook -C role_httpd.yml
[root@ansible ansible]#ansible-playbook role_httpd.yml
[root@ansible ansible]#curl 10.0.0.17
<h1> Welcome to http website </h1>
[root@ansible ansible]#curl 10.0.0.27
<h1> Welcome to http website </h1>
3、http的报文结构和状态码总结
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.
第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息HOST将指出请求的目的地.Accept
字段声明自己可以接受哪些数据格式。Connection
字段最常用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用
第三部分:空行,请求头部后面的空行是必须的
即使第四部分的请求数据为空,也必须有空行。
第四部分:请求数据也叫主体,可以添加任意的其他数据。
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二部分:消息报头,用来说明客户端要使用的一些附加信息Content-Length
字段,表明本次回应的数据长度。Content-Type
字段用于服务器回应时,告诉客户端,本次数据是什么格式Content-Encoding
字段说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式
第二行和第三行为消息报头,
Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
第三部分:空行,消息报头后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息。
空行后面的html部分为响应正文。
五大类 HTTP 状态码
1xx
类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。
2xx
类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。
-
「200 OK」是最常见的成功状态码,表示一切正常。如果是非
HEAD
请求,服务器返回的响应头都会有 body 数据。 -
「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
-
「206 Partial Content」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。
3xx
类状态码表示客户端请求的资源发送了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。
-
「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
-
「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
301 和 302 都会在响应头里使用字段 Location
,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。
- 「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。
4xx
类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。
-
「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
-
「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
-
「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
5xx
类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。
-
「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
-
「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
-
「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
-
「503 Service Unavailable」表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后重试”的意思。