ansible可以使用普通命令的方式管理主机,如果服务器数量多的话,配置信息比较多,一个一个的敲出来就有点繁琐了,还容易出错,这时可以使用ansible playbook 编写剧本,从而实现更加简便的方式实现任务处理的自动化与流程化。
playbook其实就像shell脚本一样,脚本是由多个命令组成,而playbook由多个任务,多个模块组成一个完整的流程控制集合。
Playbook主要有以下四部分构成:
下面是一个很基本的剧本(Playbook又称为剧本)
---
- hosts: web
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=installed
- name: add index file
copy: src=/root/index.html dest=/var/www/html/index.html
- name: start service
service: name=httpd state=started enabled=yes
解析如下:
--- #三个杠表示剧本文件的开头
- hosts: web #执行任务的主机列表,这里是给web主机组
remote_user: root #远程执行用户
tasks: #任务的开始
- name: install httpd #每一个tasks必须有一个名称name,可以理解为一个标记,执行时可以看到
yum: name=httpd state=installed #使用yum模块执行安装http的功能
- name: add index file
copy: src=/root/index.html dest=/var/www/html/index.html #使用copy模块复制主页文件
- name: start service
service: name=httpd state=started enabled=yes #使用service模块开启服务
其中要注意:
同级的缩进要对齐,hosts,remote_user,tasks 就是同级
每一个模块都使用key=value格式如remote_user: root 冒号后面有空格
remote_user: root 对应 key: value 如果不明白key=value 就记住模块后面等于值,写的时候冒号加空格
ansible-playbook -C inshttp.yml
ansible-playbook(命令) -C(选项) inshttp.yml(剧本文件) 一般直接命令加文件也可以
-C选项 可以检查语法是否有问题,不真实执行。
可以看到:ok =4 说明语法没问题 chenged=0 说明没有做改变。
下面使用ansible-playbook inshttp.yml 执行一下
可以看到有三处改变。
如果没问题被控端会安装好http,拷贝文件,并开启服务。
这里是被控端的截图:
这就是一个最基本的使用了。
handler:定义task执行完成以后需要调用的任务
handlers能用到什么地方呢?
举例:如果配置文件需要修改,比如现在要修改index.html的内容,修改过后再次执行,那么ansible会把新的文件拷贝过去,但是不会重启服务,我们的修改就没有意义了。这时可以使用handlers。
handler由 notify和handlers组成,notify位置的任务执行那么会调用handlers里的任务,下面是一个修改文件后执行重启的例子。
---
- hosts: web
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=installed
- name: add index file
copy: src=/root/index.html dest=/var/www/html/index.html
notify: restart httpd #notify这里的任务如果执行,就会触发下面handlers模块的restart httpd 任务,这里notify仅监控添加文件这一段
- name: start service
service: name=httpd state=started enabled=yes
handlers:#这里的任务可以有多个
- name: restart httpd
service: name=httpd state=restarted
这里修改了文件内容:
执行后可以看到文件修改并重启了。
tags用于让用户选择运行或略过playbook中的部分代码。
- hosts: web
remote_user: root
tasks:
- name: install mem
yum: name=memcached state=installed
tags: insmem #这里为任务添加了一个标签,可以选择仅执行此任务
- name: add index file
copy: src=/root/index.html dest=/var/www/html/index.html
tags: addfile#这里也是
notify: restart httpd
- name: start service
service: name=httpd state=started enabled=yes
tags: staservice #这里也是
handlers:
- name: restart httpd
service: name=httpd state=restarted
ansible-playbook -t insmem inshttp.yml 仅执行insmem标签的任务其他任务忽略,也可以同时执行多个标签,逗号隔开。
变量的三种定义方式:
1,hosts文件中定义
在 /etc/ansible/hosts文件中定义filename变量,值是aaa
下面使用变量查看效果
ansible-playbook a.yml 会报一下警告:这个警告的意思是现在使用的shell模块创建文件,推荐使用file模块
执行后效果如下:
2,在剧本文件中定义
插入了以下两行:
vars:
- filename: bbb
执行效果如下:
可以看到剧本中的变量定义优先级大于hosts文件
3,在命令行定义
ansible-playbook -e 'filename=ccc' a.yml
-e 指定变量
执行效果如下:
以上就是3种定义变量的方式了。
templates的作用就是根据变量动态生成不同的文件,templates文件必须放于templates目录下,
templates目录要和剧本文件同一个位置。
下面提一个需求,默认安装好http是监听了本机所有ip,现在要求监听自己的指定ip。
为了看出效果,这里准备两个http服务器。
ansible web -m setup 是ansible的一个模块,执行后可以看到每个机器的各种信息。
ansible web -m setup|grep address 可以使用过滤,找到ip地址对应的变量
可以看到变量address对应了ip地址
知道了ip的变量后开始创建templates模板、
首先在剧本文件相同位置创建一个名为templates的目录、
然后将模板文件拷贝到这下面
mkdir templates
cp /etc/httpd/conf/httpd.conf templates/httpd.conf.j2
hosts添加变量:
然后修改模板文件
vim templates/httpd.conf.j2
下面修改剧本:
这里一般配合Handlers使用,修改后重启
ansible-playbook a.yml
执行后结果:
192.168.43.20的配置文件如下:
192.168.43.31的配置文件如下:
下面是一个模板拷贝后重启的写法:
---
- hosts: web
remote_user: root
tasks:
- name: copy file
template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
handlers:
- name: restart httpd
service: name=httpd state=restarted
好了,为了篇幅不是太长,这里就先结束了。后续更新其他Playbooks内容,希望对你有所帮助!!
下面是我朋友的博客,发的博文挺不错!大家可以去看一下,了解 了解。
https://blog.csdn.net/qq_39591494