美文网首页
Ansible运维自动化工具(6)-Playbook

Ansible运维自动化工具(6)-Playbook

作者: 刘小白DOER | 来源:发表于2021-08-02 23:24 被阅读0次

        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的部署。

    相关文章

      网友评论

          本文标题:Ansible运维自动化工具(6)-Playbook

          本文链接:https://www.haomeiwen.com/subject/zcgjvltx.html