一、Ansible介绍
基于python语言实现,无需代理,适用中小型应用环境。
特性:
模块化:调用特定的模块,完成特定任务
有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
支持自定义模块
基于Python语言实现
部署简单,基于python和SSH(默认已安装)
安全,基于OpenSSH
支持playbook编排任务
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
无需代理不依赖PKI(无需ssl)
可使用任何编程语言写模块
YAML格式,编排任务,支持丰富的数据结构
较强大的多层解决方案
1.1 Ansible主要组成
- ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
- INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
- MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
- PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
- API:供第三方程序调用的应用程序编程接口
- ANSIBLE:组合INVENTORY、API、MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具
ansible命令执行来源:
- USER,普通用户,即SYSTEM ADMINISTRATOR
- CMDB(配置管理数据库) API 调用
- PUBLIC/PRIVATE CLOUD API调用
- USER-> Ansible Playbook -> Ansibile
利用ansible实现管理的方式:
- Ad-Hoc 即ansible命令,主要用于临时命令使用场景
- Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程
Ansible-playbook(剧本)执行过程:
- 将已有编排好的任务集写入Ansible-Playbook
- 通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行
Ansible主要操作对象:
- HOST 主机
- NETWORKING 网络设备
1.2 Ansible架构
1.3 Ansible工作原理
1.4 playbook 介绍
- playbook是由一个或多个“play”组成的列表
- play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
- Playbook采用YAML语言编写
1.4.1 YAML 语言
YAML是一个可读性高的用来表达资料序列的格式。
特性:
- YAML的可读性好
- YAML和脚本语言的交互性好
- YAML使用实现语言的数据类型
- YAML有一个一致的信息模型
- YAML易于实现
- YAML可以基于流来处理
- YAML表达能力强,扩展性好
1.4.1.1 YAML 语法
- 在单一档案中,可用连续三个连字号(- - -)区分多个档案。另外,还有选择性的连续三个点号( ... )用来表示档案结尾
- 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
- 使用#号注释代码
- 缩进必须是统一的,不能空格和tab混用
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
- YAML文件内容是区别大小写的,k/v的值均需大小写敏感
- 多个k/v可同行写也可换行写,同行使用,分隔
- v可是个字符串,也可是另一个列表
- 一个完整的代码块功能需最少元素需包括 name 和 task
- 一个name只能包括一个task
- YAML文件扩展名通常为yml或yaml
List:列表,其所有元素均使用“-”打头
示例:
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
Dictionary:字典,通常由多个key与value构成
示例1:
---
# An employee record
name: Example Developer
job: Developer
skill: Elite
也可以将key:value放置于{}中进行表示,用,分隔多个key:value
示例2:
---
# An employee record
{name: Example Developer, job: Developer, skill: Elite}
1.4.2 playbook 核心组成
- hosts 执行的远程主机列表
- tasks 任务集
- variables 内置变量或自定义变量在playbook中调用
- templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
- handlers 和 notity 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
- tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
1.4.3 playbook 基础结构
- hosts:
playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
可以为如下形式:
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
websrvs:dbsrvs 或者,两个组的并集
websrvs:&dbsrvs 与,两个组的交集
webservers:!dbsrvs 在websrvs组,但不在dbsrvs组
remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
示例:
- hosts: websrvs
remote_user: root
tasks:
- name: test connection
ping:
remote_user: magedu
sudo: yes #默认sudo为root
sudo_user:wang #sudo为wang
- task列表和action
play的主体部分是task list,task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后,再开始第二个任务
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出
tasks:任务列表
两种格式:
(1) action: module arguments
(2) module: arguments 建议使用
注:shell和command模块后面跟命令,而非key=value
某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers
任务可以通过"tags“打标签,可在ansible-playbook命令上使用-t指定进行调用
示例:
tasks:
- name: disable selinux
command: /sbin/setenforce 0
如果命令或脚本的退出码不为零,可以使用如下方式替代
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
或者使用ignore_errors来忽略错误信息
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True
1.4.2 playbook 基本使用
- 运行playbook的方式
ansible-playbook <filename.yml> ... [options]
常见选项
--check -C 只检测可能会发生的改变,但不真正执行操作
--list-hosts 列出运行任务的主机
--list-tags 列出tag
--list-tasks 列出task
--limit 主机列表 只针对主机列表中的主机执行
-v -vv -vvv 显示过程
示例:实现自动化安装httpd
yum -y install ansible ##来自epel软件仓库源
cat httpd.yml
---
- hosts: all
remote_user: root
tasks:
- name: install package.
yum: name=httpd
- name: service
service: name=httpd state=started enabled=yes
tags: service
二、HTTP服务介绍
超文本传输协议 http(Hyper Text Transfer Protocol),工作在应用层。默认端口:tcp/80。
2.1 HTTP工作机制
工作机制:
http请求:http request
http响应:http response
一次http事务:请求<-->响应
提高HTTP连接性能:
并行连接:通过多条TCP连接发起并发的HTTP请求
持久连接:keep-alive,长连接,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接
管道化连接:通过共享TCP连接发起并发的HTTP请求
复用的连接:交替传送请求和响应报文(实验阶段)
Web资源:web resource
一个网页由多个资源构成,打开一个页面,会有多个资源展示出来,但是每个资源都要单独请求。因此,一个“Web 页面”通常并不是单个资源,而是一组资源的集合静态文件:无需服务端做出额外处理
文件后缀:.html, .txt, .jpg, .js, .css, .mp3, .avi动态文件:服务端执行程序,返回执行的结果
文件后缀:.php, .jsp ,.asp
2.2 HTTP通信过程
2.3 HTTP服务器
http服务器程序:
apache(httpd)
nginx
lighttpd
2.3.1 httpd 介绍
20世纪90年代初,国家超级计算机应用中心NCSA开发
1995年开源社区发布apache(a patchy server)
功能特性:
- 虚拟主机
IP、Port、FQDN
- CGI:Common Gateway Interface,通用网关接口
- 反向代理
- 负载均衡
- 路径别名
- 丰富的用户认证机制
basic
digest
- 支持第三方模块
2.3.2 httpd 虚拟主机
- 站点标识: socket
IP相同,但端口不同
IP不同,但端口均为默认端口
FQDN不同: 请求报文中首部 Host: www.bza.com - 有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址
基于port:为每个虚拟主机使用至少一个独立的port
基于FQDN:为每个虚拟主机使用至少一个FQDN
配置示例:建立httpd服务器,要求提供两个基于名称的虚拟主机
yum -y install httpd ##安装httpd软件包
mkdir -pv /web/vhosts/{x,y} ##创建虚拟主机的站点目录
echo 'www.X.com' > /web/vhosts/x/index.html ##创建并写入站点1默认主页文件内容
echo 'www.Y.com' > /web/vhosts/y/index.html ##创建并写入站点2默认主页文件内容
cp /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf /etc/httpd/conf.d/vhosts.conf ##拷贝虚拟主机配置模板文件
vi /etc/httpd/conf.d/vhosts.conf ##编辑虚拟主机配置文件,修改如下内容
<VirtualHost *:80>
ServerName www.X.com
DocumentRoot "/web/vhosts/x"
ErrorLog "/var/log/httpd/x.err"
CustomLog "/var/log/httpd/x.access" common
<Directory "/web/vhosts/x">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName www.Y.com
DocumentRoot "/web/vhosts/y"
ErrorLog "/var/log/httpd/www2.err"
CustomLog "/var/log/httpd/y.access" common
<Directory "/web/vhosts/y">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
systemctl restart httpd ##重启服务,使更改生效