十六、运维自动化Ansible及HTTP服务

一、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 ... [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  ##编辑虚拟主机配置文件,修改如下内容

ServerName www.X.com
DocumentRoot "/web/vhosts/x"
ErrorLog "/var/log/httpd/x.err"
CustomLog "/var/log/httpd/x.access" common


Options None
AllowOverride None
Require all granted





ServerName www.Y.com
DocumentRoot "/web/vhosts/y"
ErrorLog "/var/log/httpd/www2.err"
CustomLog "/var/log/httpd/y.access" common


Options None
AllowOverride None
Require all granted




systemctl restart httpd  ##重启服务,使更改生效

你可能感兴趣的:(十六、运维自动化Ansible及HTTP服务)