之前有两篇文章分别讲了 Ansible 的部署、Ansible 的 模块使用,对 Ansible 有了最初的了解,这篇文章最主要是要介绍 Playbook。
需要了解 Ansible 的部署请点击:Ansible 第一部 :部署
需要了解 Ansible 的模块庆典节:Ansible 第二部:模块使用
Playbook 介绍
Playbook 是由一个或多个play 组成的列表,主要功能是将task 定义好的角色归并为一组进行统一管理,也就是通过task 调用 Asible 的模板将多个 play 组织在一个 Playbook 中运行。
playbook 由以下各部分组成: (1)Tasks :任务,即调用模块完成的一个操作; (2)Variables:变量; (3)Templates:模板; (4)Handlers:处理器,当一个条件满足时,触发执行的操作; (5)Roles:角色。
YAML 介绍
YAML 是一种用来表达资料顺序的格式,它由于餐卡了其他多种语言,所以具有很高的可读性。可以认为它就是一种语言格式,必须按照它的这种格式来写语言,才能生效。
它的特性:
1)具有很好的可读性,易于实现;
2)表达能力强,扩展性好;
3)和脚本语言的交互性好;
4)有一个一致的信息规模;
5)可以居于流来处理。
官网地址:http://www.yaml.org
YAML 常用的数据类型
YML 中有两种常用的数据类型,分别是:list 和 dictionary。
(1)list
列表(list)的所有元素均使用 “ - ” 开头,列如:
-Apple -Orange -strawberry -Mango
(2)dictionary
字典(dictionary)通过 key 与 value 进行标识,如:
name: chenglong Job: xuexi Skill: Elite
也可以使用 key:value 的形式放置于 { } 中进行标识,如:
{ name: Exanple Developer,Job: Developer,Skill: Elite }
Ansilble 基础元素介绍
(1)Inventory(主机清单)
Ansible 为了更加便捷的管理主机,在主机清单中将被管理主机进行分组命名,默认的主机清单位置为:/etc/ansible/hosts 文件。
1)主机变量:
可以在定义主机时添加主机变量,以便在后续的 playbook 中使用,如:
[aaa_servers] www1.baidu.com http_port=80 maxRequestsChild=800 www2.baidu.com http_port=8080 maxRequestsChild=900
2)组变量
组变量是指给指定主机设hi可以在 palybook 中直接使用的变量,如:
[aaa-vars] net_server=ntp.example.org nfs_server=nfs.example.org
3)组嵌套
在 Inventory 中的组还可以嵌套在其他的组,也可以向组中的主机指定变量,但是这些变量都只能在 ansible-playbook 工具中使用,直接使用 Ansible 工具并不会支持,如:
[aaa] www1.baidu.com http_port=80 maxRequestsChild=800 www2.baidu.com http_port=8080 maxRequestsChild=900 [bbb] 192.168.100.100 192.168.100.101 [ccc:ddd] aaa bbb
(2)变量
在 Ansible 中变量名仅能由字母、数字和下划线组成,并且只能以字母开头。可以使用两种方式来传递 Ansible 变量。
1)通过命令行来传递变量。
在运行 playbook 的时候,可以通过命令行的方式传递变量,给 playbook 使用,如:
ansible-playbook test.yml -e "http_port=8080"
2)在写 playbook 时定义,并且调用。
- hosts: aaa remote_user: root vars: ** //定义变量** - package: apache //变量定义 package - server: httpd //变量定义 server tasks: - name: check latest yum: name={{ package }} state=latest //调用变量 package - name: start apache service: name={{ server }} state=started //调用变量 server
(3)条件测试
1)when 就是条件判断,你给与的条件成立,它就会执行 tasks 里的任务,如果不满足就不执行。
- hosts: aaa remote_user: root tasks: - name: install apache yum: name=httpd when: - ansible_distribution == "CentOS" //满足条件 1 - ansible_distribution_major_version == "6" //满足条件 2
2)迭代,当需要执行重复任务时,如果一个一个写,就很麻烦,这时就需要用到 迭代,把需要重复执行的动作,定义为 item 变量并进行引用,然后通过 with_items 语句来指明元素。
- hosts: aaa remote_user: root tasks: - name: install pachages yum: name={{ item }} state=latest with_items: - httpd - openssh - mysql
Hosts 和 Users 介绍
palybook 的设计目的就是为了让某些主机以某个用户的身份去执行相应的任务。其中用于执行任务的主机用 hosts 定义,执行用户用 remote_user 来定义。如下:
- hosts: aaa remote_user: root
remote_user 可以定义指定用户通过 sudo 的方法在被管理主机上运行执行
- hosts: aaa remote_user: root become: yes become_user: oracle 切换用户为Oracle
任务列表和 action 介绍
- > play 的主体是 任务列表(Tasks list)。任务列表中的任务按照次序逐个在hosts 中指定的所有主机上执行,在顺序执行这些任务时,如果有错误发生将会回滚。
- > task 的任务是按照指定的参数去执行模块,每个 task 都使用 name 输出 palybook 的运行结果,一般输出的内容为描述该任务执行的步骤,如果没有提供将输出 action 的运行结果。
-
列如:
- hosts: aaa remote_user: root tasks: - name: install pachages // name: 自定义名称 yum: name=httpd state=latest // yum:安装 httpd 服务,检测是否是最新版本 - name: disable selinux command: /sbin/setenforce 0 //关闭selinux - name: disable firewall command: systemctl stop firewalld //关闭防火墙 - name: apache service: name=httpd enabled=true state=started //启动httpd服务,设置为开启自启 ansible-playbook -C aaa.yml 检测语法与过程是否正确,不会正真的执行!
Handlers 介绍
Handlers 用于当关注的资源变化的时候采取的操作。在 notify 中累出的操作便成为 handler,也就是在 notify 中需要条用 handler 中定义的操作。而 notify 这个动作 在每个 play 的最后被触发,仅在所有的变化发生完成后一次性地执行指定操作。
Templates 介绍
Templates 可以看作是一个编译过的模板文件,用来产生目标文本,传递变量给模板去替换里面中的标记。
准备一个配置文件模板,必须以 .j2 格式。再对模板进行编辑,统一模板。
[[email protected] ~]# vim /etc/httpd/conf/httpd.conf.j2
- hosts: aaa remote_user: root tasks: - name: install pachages yum: name=httpd state=latest - name: disable selinux command: /sbin/setenforce 0 - name: file to httpd template: src=/etc/httpd/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
Tages 介绍
如果多次执行修改 playbook 会涉及到一些没有变化的代码,可以使用tags 让用户选择跳过没有变化的代码,只运行 tags 标记的代码。它就是一个 “ 标签 ” 。