linux-ansible-04 ansible-playbook
概念解析
playbook
Playbooks俗称”剧本“,是一种高效运用Ansible的方式,也是系统ansible命令的集合。playbook利用yaml语言编写,其命令根据自上而下的顺序依次执行。
简单来说,Playbooks 是一种简单的配置管理系统与多机器部署系统的基础。与现有的其他系统有不同之处,且非常适合于复杂应用的部署。
同时,Playbooks开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。
Playbooks可用于声明配置,更强大的地方在于,在Playbooks中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤。并且可以同步或异步的发起任务。
我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,他的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML(Yet Another Markup Language)。YAML语法能够简单的表示散列表,字典等数据结构,详情可参考:YAML详细语法 。
YAML
YAML是“YAML不是一种标记语言”的外语缩写,又被称为“另外一种标记语言”,但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名。它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。
playbook基础组件
Hosts:运行执行任务(task)的目标主机
remote_user:在远程主机上执行任务的用户
tasks:任务列表,由模块定义的操作列表
handlers:任务,和nogity结合使用,为条件触发操作,满足条件方才执行,否则不执行;与tasks不同的是只有在接受到通知时才会被触发。
templates:使用模板语言的文本文件,使用jinja2语法。
variables:变量,变量替换{{ variable_name }},内置变量或自定义变量在playbook中调用
roles: 角色
整个playbook是以task为中心,表明要执行的任务;hosts和remote_user表明在哪些远程主机以何种身份执行;其他组件让其能够更加灵活。
官方实例
1 | - hosts: webservers |
1 | 运行: |
实例解析
webservers是官方对其管理机所管理服务器的统称,我们这里用的是node。
vars: #在playbook中定义变量
http_port: 80
max_clients: 200
变量的引用:
变量
变量的来源:
- ansible setup facts远程主机的所有变量都可以用
- 自定义变量
优先级:
- 通过命令行指定变量,优先级最高
- 在/etc/ansible/hosts 定义变量,在主机组中的主机单独定义
- 在/etc/ansible/hosts 定义变量,针对主机组中的所有主机集中定义变量
- 在Playbook中定义变量(建议使用这种方法)
模版
- 使用模板语言的文本文件内部嵌套有模板语言脚本(使用模板语言编写)
- Jinja2 是由python编写的。在我们打算使用基于文本的模板语言时,jinja2是很好的解决方案。yaml是写playbook,jinja2是写配置文件模板的。
- 功能:将模板的文件的变量值转换成对应的本地主机的确定值。例如:ansible端写一个内建变量,当这个文件被复制到对应主机时会自动生成对应主机 cpu的颗数的结果替换之。
- templates文件必须存放在templates目录下
- yaml文件需要和templates目录平级
- template只能在palybook中使用。
- Jinja2语法
1 | 字面量: |
实例
1 | [root@node1 templates]# cat nginxconf.j2.bak |
条件判断
一般通过when或者迭代循环
1 | - name: restart Nginx |
循环迭代
迭代列表或者键值对
1 | #基于字符串列表 |
角色roles
1 | [root@node1 ~]# tree /etc/ansible/roles/ |
- tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;
- handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;
- vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
- templates/:存储由template模块调用的模板文本;
- meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;
- default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
- files目录:存放由copy或script等模块调用的文件;
调用roles
1 | [root@node1 ~]# cat /etc/ansible/roles/site.yml |
实例分析
1 | [root@node1 ansible]# tree roles/ |
任务tasks
执行的模块命令
1 | 格式: |
playbook调用方式
1 | 用法: |
palybook实验
实验准备
下述实验环境和之前的一样,无需改动即可。
在服务端安装ansible
1 | [root@localhost ~]# yum install epel-release -y |
服务端修改主机清单配置文件host
1 | [root@localhost ~]# vim /etc/ansible/hosts |
服务端修改host文件
1 | [root@localhost ~]# vim /etc/hosts |
通过playbook添加用户示例
(1)给远程主机node3添加用户test
1 | [root@test ~]# vim user.yml |
上面的playbook 实现的功能是新增一个用户:
1 | name:对该playbook实现的功能做一个概述,后面执行过程中,会打印name变量的值 |
(2)删除远程主机test的账号
只需改一行:
user: name=”“ state=absent remove=yes
1 | [root@test ~]# vim user.yml |