十六、运维自动化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 <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  ##重启服务,使更改生效
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270