一、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服务器同步一次时间
⑨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