Ansible每个模块实现的功能都很简单,Playbook可以将模块组合起来实现复杂的功能。Playbook使用yaml格式进行定义。一个Playbook包含一到多个play,每一个play是一个完整的部署任务,play中是定义对哪些服务器执行操作以及执行哪些操作。
一、简单案例测试
我们先来测试一个案例,定义了两个play。一是对lamp82服务器重启apache服务,这需要root权限;二是对tcloud服务器拷贝文件并修改权限。
first_yaml.yml文件里面包含一个play,使用列表的形式进行定义,“-”表示列表。一个play必须包含下面的两项:
1、hosts:定义对哪些服务器执行操作。
2、tasks:定义执行的任务列表,一个play可以包含多个tasks。
运行 ansible-playbook first_yaml.yml 执行结果图如下,结果后面会有统计信息。
为了可读性和可维护性,一般在一个playbook中编写一个play。我们可以将上面两个play分成两个playbook,然后使用include(You should use 'import_playbook' instead. This feature will be removed in version 2.12)导入其他playbook。笔者将上面的一个playbook分为两个playbook:copyfile.yml和restart_apache.yml,在all.yml中import_playbook这两个playbook。被导入的playbook会依次执行,效果与上面的一致。
二、 ansible-playbook参数
可通过ansible-playbook --help来查看,常用的如下:
1、 -T TIMEOUT, --timeout TIMEOUT,建立ssh连接吃的超时时间;
2、-i INVENTORY, --inventory INVENTORY, --inventory-file INVENTORY ,指定hosts文件;
3、-f FORKS, --forks FORKS,并发执行的进程数,默认是5;
4、--list-hosts,playbook匹配的服务器列表;
5、--step ,每执行一个任务后停止,等待用户确认,实现单步调试;
6、--list-tasks ,列出任务列表;
7、--syntax-check ,检查playbook语法,但不会执行;
笔者少写一个“-”,检查到错误。
8、 -C, --check,检查playbook是否会对服务器进行修改,相对于预测结果,但不会执行。
三、Playbook详细语法
1、权限
play中可以使用remote_user来指定连接远程服务器的user,也可以在细分task中指定特定用户。在restart_apache.yml中,使用了hosts中的普通用户,使用 become: yes ,become_method: sudo来提权,也可以将提权放在具体的task中。
2、通知
在ansible中,模块是幂等的。上面的copyfile.yml,我们再次执行,会发现changed=0,原因是远程服务器刚才已经执行过,存在这个文件,权限也是。再次执行,会返回成功,但是changed=0 。
我们将copyfile.yml修改如下,增加notify选项,如果copy模块发生修改,则notify会通知handler执行。task使用handler的名字作为参数,以此来触发特定的handler。
那么我们先把远程服务器上data.txt删除,再次执行ansible-playbook copyfile.yml ,发现handler被执行了。handler只会在所有task执行完毕后执行,并且即便handler被触发多次,它也会执行一次。handler的唯一用户,官方定义就是重启服务或者服务器。
3、变量
可以将变量定义在palybook的vars里面,变量较多时可以将变量定义在文件中,通过vars_file选项引用这个文件(key:value格式)。
ansible可以获取任务的执行结果,将结果保存在变量中,在之后引用这个变量。ansible使用register来获取,称为注册变量。
下面的mysql.yml先是调shell检查mysql进程释放存在,保存在register变量mysql_exist中,然后调用service模块,根据变量mysql_exist的值来决定是否执行启动mysqld服务。
我们现在远程服务器上杀掉mysql进程:sudo systemctl stop mysqld,在执行ansible-playbook mysql.yml ,结果如下:
再通过 ansible lamp82 -m shell -a "pgrep mysql" 查看进程又存在了。
4、Facts变量
Facts变量是ansible执行前从远程服务器中获取的系统信息。可以通过setup模块查看Facts变量的列表。playbook中可以通过变量的名字引用变量,比如 {{ansible_all_ipv4_addresses}} 、{{ansible_os_family}}等等。
可以通过gather_facts选项控制是否收集远程服务器的变量,默认是yes。如果不需要则可以关闭来提高ansible的效率。
5、任务执行策略
playbook是以task为单位来执行的,ansible默认以5个进程对远程服务器执行任务。再默认的任务执行策略中,ansible执行task1,并且需要等到所有服务器执行完task1以后再开始执行task2,以此类推。ansible2.0开始,可以设置strategy:free来允许较快的服务器提前完成play的部署。
网友评论