一、ansible介绍:
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行
命令等功能。支持linux、BSD、MacOS等, 支持openstack 、docker等结合使用。

Ansible核心组件说明:
Ansible:Ansible的核心程序
Host Inventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载
Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.
Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Inventory中的主机,就可以完成管理主机。
Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。
Connection Plugins:连接插件,Ansible和Host通信使用

ansible 特性:
①不需要安装客户端(支持ssh)
②不需要启动服务(ansible)
③基于模块工作,可以使用任意语言开发模块
④基于ssh工作( 基于密钥认证)
⑤YAML格式,编排任务,支持丰富的数据结构(剧本playbook)
⑥使用python编写,维护简单

二、Ansible的安装部署:
1.安装ansible:

[root@localhost ~]# yum install -y epel*
[root@localhost ~]# yum install -y ansible
[root@localhost ~]# rpm -qc ansible  //查询到ansible的配置文件
/etc/ansible/ansible.cfg
/etc/ansible/hosts

2.配置ansible:

[root@localhost ~]# vim /etc/ansible/hosts    //修改ansible的主配置文件
192.168.48.131      //添加一个被管理主机
[root@localhost ~]# ssh-keygen -t rsa    //生成秘钥
[root@localhost ~]# ssh-copy-id -i 192.168.48.131  //把公钥拷贝给被管理端主机
[root@localhost ~]# ansible 192.168.48.131 -m ping      //m表示模块名,ping代表ping模块

成功连接
如果有多台主机的话可以给它们加个标签:
标签
然后直接用标签去连接:

[root@localhost ~]#ansible A -m ping   //两台主机都ping通了

三、模块:
ansible中最主要的就是模块了:

[root@localhost ~]#ansible-doc -l       //查看ansible中支持的所有模块
[root@localhost ~]#ansible-doc ping     //查看ping模块的使用方法及基本介绍

①user模块:
管理远程主机上的用户的账号。常见参数有:

name=   指明要管理的账号名称
state=present|absent   指明是创建账号还是删除账号,present表示创建,absent表示删除
system=yes|no   指明是否为系统账号  
uid=   指明用户UID
group=   指明用户的基本组
groups=   指明用户的附加组
shell=   指明默认的shell  
home=   指明用户的家目录
move_home=yes|no   当home设定了家目录,如果要创建的家目录已存在,是否将已存在的家目录进行移动
password=   指明用户的密码,最好使用加密好的字符串
comment=   指明用户的注释信息
remove=yes|no   当state=absent时,也就是删除用户时,是否要删除用户的家目录
下面我们来看一个例子:
[root@localhost ~]# ansible A -m user -a "name=rose uid=501 state=present  comment='rose user'"   //创建一个用户

创建用户

[root@localhost ~]# ansible A -m user -a 'name=martin state=absent remove=yes'     //移除用户及家目录

ansible创建用户时,无法添加密码的问题(解决方案):

(https://blog.51cto.com/10978134/2132334?source=dra)

②group模块:
用来添加或删除远端主机的用户组 常见参数有:

name=                  被管理的组名
state=present|absent   是添加还是删除,不指名默认为添加
gid=                   指明GID
system=yes|no          是否为系统组

例子:

[root@localhost ~]#ansible A -m group -a 'name=hr gid=2000 state=present'            //创建一个hr组

③file模块:
用于设定远程主机上的文件属性,常见参数有:

path=   指明对哪个文件修改其属性
src=    指明path=指明的文件是软链接文件,其对应的源文件是谁,必须要在state=link时才有用
state=   directory|link|absent   表示创建的文件是目录还是软链接
owner=   指明文件的属主
group=   指明文件的属组
mode=    指明文件的权限
创建软链接的用法:
     src=  path=  state=link
修改文件属性的用法:
     path=  owner=  mode=  group=
创建目录的用法:
     path=  state=directory
删除文件:
     path= state=absent

例子:

创建一个软连接:
[root@localhost ~]#ansible A -m file -a 'src=/etc/passwd path=/tmp/passwd.link state=link'   
删除文件:
[root@localhost ~]#ansible A -m file -a 'path=/tmp/cc.txt state=absent'
修改文件属性:
[root@localhost ~]#ansible A -m file -a 'path=/tmp/bb.txt mode=700 owner=root group=nobody'

④copy模块:
拷贝ansible管理端的文件到远程主机的指定位置,常见参数:

dest=    指明拷贝文件的目标目录位置,使用绝对路径,如果源是目录,则目标也要是目录,如果目标文件已存在,会覆盖原有内容
src=     指明本地路径下的某个文件,可以使用相对路径和绝对路径,支持直接指定目录,如果源是目录,则目标也要是目录
mode=    指明复制时,目标文件的权限
owner=   指明复制时,目标文件的属主
group=   指明复制时,目标文件的属组
content= 指明复制到目标主机上的内容,不能与src一起使用,相当于复制content指明的数据,到目标文件中

例子:

[root@localhost ~]#ansible A -m copy -a "src=/etc/hosts dest=/tmp mode=600 owner=rose group=root"     //拷贝文件并指定属主和属组

⑤shell模块:(常用模块)
支持重定向,管道

[root@localhost ~]#ansible A -m shell -a  "ps aux | grep nginx" 

⑥yum模块:
基于yum机制,对远程主机管理程序包,常用参数有:

name=   		指明程序包的名称,可以带上版本号,不指明版本,就是默认最新版本 
name=httpd
name=httpd-2.2.15
state=present|lastest|absent   指明对程序包执行的操作,present表示安装程序包,latest表示安装最新版本的程序包,absent表示卸载程序包
disablerepo=   				   在用yum安装时,临时禁用某个仓库,仓库的ID   仓库id查看方式 (yum repolist)
enablerepo=   				   在用yum安装时,临时启用某个仓库,仓库的ID
conf_file=     				   指明yum运行时采用哪个配置文件,而不是使用默认的配置文件
disable_gpg_check=yes|no  	   是否启用gpg-check
卸载软件包:
[root@localhost ~]# ansible A -m yum -a 'name=nmap state=absent'
安装软件包:
[root@localhost ~]#  ansible A -m yum -a 'name=nmap state=present'
安装httpd:
[root@localhost ~]#  ansible A -m yum -a 'name=httpd disable_gpg_check=yes disablerepo=yum state=present'

⑦service模块:
用来管理远程主机上的服务的模块,常见参数有:

name=                             被管理的服务名称(/etc/init.d)
state=started|stopped|restarted   表示启动或关闭或重启
enabled=yes|no                    表示要不要设定该服务开机自启动
runlevel=                         如果设定了enabled开机自动启动,则要定义在哪些运行级别下自动启动

例子:

[root@localhost ~]# ansible A -m service -a "name=httpd state=started"   //启动httpd服务
[root@localhost ~]# ansible A -m shell -a "service httpd status"

⑧cron模块:
管理计划任务的模块,常见参数有:

minute=  指明计划任务的分钟,支持格式:0-59,*,*/2等,与正常cron任务定义的一样的语法,省略时,默认为*,也就是每分钟都执行
hour=    指明计划任务的小时,支持的语法:0-23,*,*/2等,省略时,默认为*,也就是每小时都执行
day=     指明计划任务的天,支持的语法:1-31,*,*/2等,省略时,默认为*,也就是每天都执行
month=   指明计划任务的月,支持的语法为:1-12,*,*/2等,省略时,默认为*,也就是每月都执行
weekday= 指明计划任务的星期几,支持的语法为:0-6,7 ,*等,省略时,默认为*,也就是每星期几都执行
reboot   指明计划任务执行的时间为每次重启之后
name=    给该计划任务取个名称,必须要给明。每个任务的名称不能一样。
job=     执行的任务是什么,当state=present时才有意义
state=present|absent   表示这个任务是创建还是删除,present表示创建,absent表示删除,默认是present

例子:

[root@localhost ~]# ansible A -m cron -a "name=date job='/usr/bin/rdate -s 192.168.48.133 &> /dev/null' state=present minute=*/2"    //每两分钟向133服务器同步一次时间

date
⑨hostname模块:
管理远程主机上的主机名,常用参数有:

name=      //指明主机名

例子:

[root@localhost ~]# ansible test -m hostname -a "name=jack.host"    //永久修改主机名

⑩fetch模块:
从远程主机拉取文件到本地。一般情况下,只会从一个远程节点拉取数据,常见参数有:

src=   指明远程主机上要拉取的文件,只能是文件,不能是目录
dest=  从远程主机上拉取的文件存放在本地的位置,一般只能是目录

例子:

[root@localhost ~]# ansible A -m fetch -a 'src=/etc/passwd dest=/tmp'

四、ansible playbook:
简单来说,playbooks 是一种简单的配置管理系统与多机器部署系统的基础.与现有的其他系统有不同之处,且非常适合于复杂应用的部署.
Playbooks 可用于声明配置,更强大的地方在于,在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤.并且可以同步或异步的发起任务.
Playbooks 的格式是YAML(详见:YAML 语法),语法做到最小化,意在避免 playbooks 成为一种编程语言或是脚本,但它也并不是一个配置模型或过程的模型.
playbook 由一个或多个 ‘plays’ 组成.它的内容是一个以 ‘plays’ 为元素的列表.
在 play 之中,一组机器被映射为定义好的角色.在 ansible 中,play 的内容,被称为 tasks,即任务.在基本层次的应用中,一个任务是一个对 ansible 模块的调用

playbook的基础组件:
Playbook 文件必须是*.yml结尾。
hosts:运行指定任务的目标主机,多个主机用:冒号分隔
remote_user:在远程主机上执行任务的用户;可以全局指定,也可以单个任务指定
sudo_user:表示以sudo方式运行任务时,切换为哪个用户身份运行
tasks: 任务列表

简单案例:
案例

测试文件语法
[root@localhost ~]# ansible-playbook --syntax-check test.yml
测试执行
[root@localhost ~]# ansible-playbook --check  test.yml
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐