该公司由 Cobbler 及 Func 的编辑者于 二零一二

葡京网站spj3355 25

一、简介

当下有许多的运维自动化工具( 配置管理
),例如:Ansible、SaltStack、Puppet、Fabric 等。

Ansible 一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,是
AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012
年创建成立。

Ansible 基于 Python 语言实现,由 Paramiko 和 PyYAML 两个关键模块构建。

二、特性

部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作。

支持Linux/UNIX及windows环境

默认使用 SSH(Secure Shell)协议对设备进行管理,用它来配置思科路由也非常方便。

主从集中化管理。
配置简单、功能强大、扩展性强。
支持 API 及自定义模块,可通过 Python 轻松扩展。
通过 Playbooks 来定制强大的配置、状态管理。
对云计算平台、大数据都有很好的支持。
葡京网站spj3355,提供一个功能强大、操作性强的 Web 管理界面和 REST API 接口 —- AWX
平台。

三、总体架构

 

葡京网站spj3355 1

四、执行过程

葡京网站spj3355 2

五、Ansible 与 SaltStack对比

>> 最大的区别是 Ansible
无需在被监控主机部署任何客户端代理,默认通过 SSH
通道进行远程命令执行或下发配置。
>> 相同点是都具备功能强大、灵活的系统管理、状态配置,都使用 YAML
格式来描述配置,两者都提供丰富的模板及
API,对云计算平台、大数据都有很好的支持。

Ansible在github上地址:

 

Ansible安装部署与配置

       角色              主机名                 
IP                                组名             

       控制端           hd01                    
192.168.1.11                 ——             

       被控端           hd02                    
192.168.1.12                 webservers   

       被控端           hd03                    
192.168.1.13                 webservers   

 

Ansible安装

安装可使用源码编译安装,也可以更新yum源后使用yum安装

 

yum 安装:

配置源(centos6)

yum install

-y

换163的源

wget      

 mv CentOS6-Base-163.repo /etc/yum.repos.d/

 yum clean all

 

CentOS6-Base-163.repo主要是为了安装:PyYAML

配置源(centos7)
rpm -iUvh

下载配置文件(centos7)
wget        
 CentOS7-Base-163.repo主要是为了安装:PyYAML
mv CentOS7-Base-163.repo /etc/yum.repos.d/

yum clean all

 

安装ansible

yum -y install ansible

查看ansible 版本

[root@hd01 ~]# ansible –version

ansible 2.5.3

  config file = /etc/ansible/ansible.cfg

  configured module search path = [u’/usr/share/my_modules’]

  ansible python module location =
/usr/lib/python2.6/site-packages/ansible

  executable location = /usr/bin/ansible

  python version = 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) [GCC 4.4.7
20120313 (Red Hat 4.4.7-17)]

注:yum装ansible      随着时间的推移,ansible版本会是最新版的。

Ansible通过定义好的主机与组规则(Inventory)对匹配的目标主机进行远程操作,配置文件默认是/etc/ansible/hosts

定义Host Inventory

添加组名及允许执行命令的主机

葡京网站spj3355 3

webservers 是组名,下面的是IP也可以使用域名、别名标识。

各主机SSH互信

[root@hd01 ~]# ssh-keygen -t rsa   #创建公钥与私钥

葡京网站spj3355 4

 

一直回车就OK

将公钥传给webservers组中的主机

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.12

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.13

葡京网站spj3355 5

 

 

测试主机免密 连通性:

[root@hd01 ~]# ansible webservers -m ping

#-m 使用ping模块  -vvv 可以查看详细的执行过程

葡京网站spj3355 6

 

OK

提示:

使用Linux普通用户账户进行连接并使用sudo命令实现root权限,格式为:

ansible webservers -m ping -u ansible -sudo

当没有做免密码访问时用 ansible webservers -m ping -k

然后输入密码 操作

 

关于定义主机与组

在/etc/ansible/hosts中主机可以用域名、IP、别名进行标识。

/etc/ansible/hosts  中组成员主机名称支持正则描述
  组成员主机IP支持正则描述

举例说明 格式:

[webservers]                #组名

alpha.example.org    #域名对应192.168.1.100     

beta.example.org     #域名对应192.168.1.110     

192.168.1.100               #IP

192.168.1.110               #IP

 

mail.example.com

192.168.1.90:2135         #定义一个SSH服务端口为:2135的主机  

 

组成员主机名称支持正则描述,举例:

[webservers]

www.[01:50].example.com

[databases]

db-[a:f].example.com

 

定义主机变量

主机可以指定变量,以便后面供Playbook配置使用,比如定义主机host1及host2上apache参数http_port及maxRequestsPerChild,目的是让两台主机产生Apache配置文件httpd.conf差异化,格式:

[atlanta]

host1 http_port=80 maxRequestsPerChild=808

host2 http_port=303 maxRequestsPerChild=909

定义组变量

组变量的作用域是覆盖所有成员,通过定义一个新块,块名由组名+”:vars”组成

格式:

[atlanta]

host1

host2

[atlanta:vars]

ntp_server=ntp. atlanta.example.com

proxy=proxy.atlanta.example.com

 

 

匹配目标

格式:ansible <目标主机或组> -m <模块名字> -a
<模块参数>

重启webservers组所有Apache服务

[root@hd01 ~]# ansible webservers -m service -a “name=httpd
state=restarted”

 

匹配目标主机规则表

192.168.1.12或者hd02              
匹配目标IP地址或主机名,多个IP或主机名使用”:”号分隔

webservers                               
匹配目标组为webservers多个组使用”:”号分隔

all或者’*’                                   匹配所有主机

hd.*或者192.168.1.*                   支持正则匹配主机或者IP地址

webservers:!192.168.1.11           
匹配webservers组且排除192.168.1.11主机IP

agent:&webservers                    匹配agent和webservers两个组的交集

webservers:!{{excluded}}:&{{required}}       支持变量匹配方式

 

Ansible常用模块及API

Ansible提供了非常丰富的功能模块,包括cloud(云计算)、Commands(命令行)、Database(数据库)、Files(文件管理)、Internal(内置功能)、Monitoring(监控管理)等等。

获取webservers组中主机uptime信息

[root@hd01 ~]# ansible webservers -m command -a “uptime”     

 

葡京网站spj3355 7

 

-m command是默认模块  可省略

[root@hd01 ~]# ansible-doc ping

可获得模块的帮助信息

EXAMPLES:

# Test we can logon to ‘webservers’ and execute python with json lib.

# ansible webservers -m ping

 

# Example from an Ansible Playbook

– ping:

 

# Induce an exception to see what happens

– ping:

    data: crash

 

RETURN VALUES:

ping:

    description: value provided with the data parameter

    returned: success

    type: string

    sample: pong

在playbook中运行远程命令格式:

– name: reboot the service

  command: /sbin/reboot -t now

 

Ansible 常用模块学习

shell > ansible-doc -l    # 列出 Ansible 支持的模块

ansible-doc <模块名>查看模块帮助信息

 

>>远程命令模块( command / script / shell )

command 作为 Ansible 的默认模块,可以运行远程权限范围所有的 shell
命令,不支持管道符。

例:

ansible webservers -m command -a “free -m”               # 查看
webservers 分组主机内存使用情况

[root@hd01 ~]# ansible webservers -m command -a “free -m”

葡京网站spj3355 8

shell 的功能是执行远程主机上的 shell 脚本文件,支持管道符。

例:

[root@hd01 ~]# ansible webservers -m shell -a
“/root/test.sh”          # 执行远程脚本

 

葡京网站spj3355 9

 

ansible的command和shell模块的区别:

比如我要批量删除一些文件, 

[root@hd01 ~]# ansible webservers -m command -a “rm -f
/root/test*.sh”

因为你的命令行中包含了通配符*号,通配符必须要有在shell环境中才能被识别出,不然,它只能删除test*.sh这一个文件。

葡京网站spj3355 10

 

虽显示成功,但目标文件未被删除

葡京网站spj3355 11

 

所以你需要执行以下命令才能成功

[root@hd01 ~]# ansible webservers -m shell -a “rm -f /root/test*.sh”

执行之后    

葡京网站spj3355 12

关于command模块运行的命令中无法使用管道符的说明。

葡京网站spj3355 13

 

script 的功能是在远程主机执行主控端存储的 shell 脚本文件,相当于 scp +
shell 组合。

例:

[root@hd01 ~]# ansible webservers -m script -a “/root/test.sh”    
 # 远程执行本地脚本

192.168.1.12 | SUCCESS => {

    “changed”: true,

    “rc”: 0,

    “stderr”: “Shared connection to 192.168.1.12 closed.rn”,

    “stdout”: “123rn”,

    “stdout_lines”: [

        “123”

    ]

}

192.168.1.13 | SUCCESS => {

    “changed”: true,

    “rc”: 0,

    “stderr”: “Shared connection to 192.168.1.13 closed.rn”,

    “stdout”: “123rn”,

    “stdout_lines”: [

        “123”

    ]

 

>>copy 模块(实现主控端向目标主机拷贝文件,类似于 scp 功能)

例:

[root@hd01 ~]# ansible webservers -m copy -a “src=/root/test.sh
dest=/tmp/ owner=root group=root mode=0755 backup=yes”

# 向 webservers 组中主机拷贝 test.sh 到 /tmp 下,owner:指定属主为
root,group:指定属组为:root ,mode:权限为 0755
, backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no

 葡京网站spj3355 14

 

>>stat 模块(获取远程文件状态信息,atime/ctime/mtime/md5/uid/gid
等信息)

例:

[root@hd01 ~]# ansible webservers -m stat -a “path=/etc/passwd”   
#path指定具体路径

葡京网站spj3355 15

 

>>get_url 模块(实现在远程主机下载指定 URL 到本地,支持 sha256sum
文件校验)

例:

[root@hd01 ~]# ansible webservers -m get_url -a
“url= dest=/tmp/index.html mode=0440 force=yes”  

 

#下载百度首页index.html文件

# force:

        yes:默认项,如果目标主机包含该文件,但内容不同,则强制覆盖

        no:则只有当目标主机的目标位置不存在该文件时,才复制

 

>>yum 模块(软件包管理)

#name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径 

#state:目标状态(present,absent,latest)

  1. present是指安装套件,而 latest 則是指安装最新的套件,也就是会使用
    yum mirror 上最新的版本。
  2. absent   卸载

 

例:yum 装httpd

[root@hd01 ~]#ansible webservers -m yum -a “name=httpd state=latest”

安装

葡京网站spj3355 16

卸载

[root@hd01 ~]#ansible webservers -m yum -a “name=httpd state=absent” 

葡京网站spj3355 17

>>cron 模块(远程主机 crontab 配置)

例: 

[root@hd01 ~]# ansible webservers -m cron -a “name=’check passwd
md5value’ hour=’8′ job=’md5sum /etc/passwd>/tep/p.txt'”

任务名字叫check passwd md5value   hour=’8’ 每天的8时执行任务

葡京网站spj3355 18

效果:

[root@hd02 ~]# crontab -l

#Ansible: check passwd md5value

* 8 * * * md5sum /etc/passwd>/tep/p.txt

[root@hd02 ~]#

 

>>mount 模块(远程主机分区挂载)

例:

[root@hd01 ~]# ansible webservers -m mount -a ‘name=/test
src=/dev/sdb1 fstype=ext3 opts=ro state=present’ 

# fstype  指定文件系统类型为ext4  

# opts     设定挂载的参数选项信息;-o ro == opts=ro 

# src       要被挂载的目录设备信息 src=/dev/sdb1

 

 

>>service 模块(远程主机系统服务管理)

例:

                                                 
        #state的4种目标状态

[root@hd01 ~]# ansible webservers -m service -a “name=httpd
state=started”  #启动httpd

葡京网站spj3355 19

[root@hd01 ~]# ansible webservers -m service -a “name=httpd
state=stopped” #关闭httpd

葡京网站spj3355 20

 

[root@hd01 ~]# ansible webservers -m service -a “name=httpd
state=restarted” #重启httpd

 

[root@hd01 ~]# ansible webservers -m service -a “name=httpd
state=reloaded” #重新加载httpd

 

>>sysctl 包管理模块

功能

远程Linux主机sysctl配置。

实例

sysctl: name=kernel.panic value=3 sysctl_file=/etc/sysctl.conf
checks=before reload=yessalt ‘*’ pkg.upgrade

 

>>user 服务模块(远程主机用户管理)

例:

[root@hd01 ~]# ansible webservers -m user -a “name=wang comment=’user
wang'”

葡京网站spj3355 21

[root@hd01 ~]# ansible webservers -m user -a “name=wang state=absent
remove=yes”    #state 目标状态  删除

葡京网站spj3355 22

实现一些监控功能

查看全部主机在线情况

[root@ansible ~]# ansible all -m ping //内建的ping模块
 #all表示/etc/ansible/hosts中全部主机

葡京网站spj3355 23

 

[root@hd01 ~]# ansible webservers -a “/bin/df -h” #输出挂载信息

葡京网站spj3355 24

 

[root@hd01 ~]# ansible webservers -a “/sbin/ip addr show dev eth0” 
#查看webservers组中主机网卡信息

葡京网站spj3355 25

 

YAML语言

yaml语言是一种基于Unicode容易阅读,容易和脚本语言交互的,用来表达数据序列的编程语言。Ansible与Saltstack环境中配置文件都以YAML格式存在,YAML文件扩展名通常为.yaml或者.yml

重要组成结构:list和directory

以下通过描述YAML与Python的对应关系,了解YAML的层次及结构

块序列描述

块序列就是将描述的元素序列到python的列表中

Python:

import yaml

obj = yaml.load(

“””

– apple

– banana

– orange

“””

)

print(obj)

结果:

[‘apple’, ‘banana’, ‘orange’]

 

YAML与Python块概念类似,例如:

 – apple

 – banana

 – orange

 – chuanzhi

 – oldboy

 – mage

对应Python结果:

[[‘apple’, ‘banana’, ‘orange’],[ ‘chuanzhi’, ‘oldboy’, ‘mage’]]

块映射描述:

块映射就是将描述的元素序列到字典的中,格式为”key:
value”,以下为YAML例子:

hero:

  hp: 34

  sp: 8

  level: 4

orc:

  hp: 12

  sp: 0

  level: 2

对应python结果为:

{‘hero’: ‘{‘hp’: 34, ‘sp’: 8, ‘level’: 4}, ‘orc’: {‘hp’: 12, ‘sp’: 0,
‘level’: 2}}

YAML块序列与块映射是可以自由组合在一起的,他们之间可以相互嵌套,通过灵活的组合实现复杂的对象属性。例如:

– hero:

   hp: 34

   sp: 8

   level: 4

– orc:

   hp:

    – 12

    – 30

   sp: 0

   level: 2

对应Python结果为:

[{‘hero’: ‘{‘hp’: 34, ‘sp’: 8, ‘level’: 4}, {‘orc’: {‘hp’: [12,30]
,’sp’: 0, ‘level’: 2}}]

 

 

 

未完待续。。