Linux云计算-就业第十三周作业

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」表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后重试”的意思。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值