ansible playbook应用
一,ansible的playbook作用
playbook(剧本),顾名思义,就是需要定义一个脚本或者说配置文件,然后定义好做什么。
ansible可以使用playbook灵活的批量执行远程命令,使用roles在playbook中作为模块多次,灵活的调用。
ansilble plabook使用YAML语言
二,YAML语法与范例
##YAML语法与范例
> - YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16
> - 使用**空白字符**(不能使用<kbd>Tab</kbd>)分层,同层元素左侧对齐
> - 单行注解由井字号(<kbd> #</kbd> )开始,可以出现在行中任何位置
> - 每个清单成员以单行表示,并用短杠+空白(<kbd>- </kbd>)起始
> - 每个杂凑表的成员用冒号+空白(<kbd>: </kbd>)分开键和值
> - 杂凑表的键值可以用问号 (<kbd>?</kbd>)起始,表示多个词汇组成的键值
> - 字串一般不使用引号,但必要的时候可以用引号框住
> - 使用双引号表示字串时,可用倒斜线(<kbd>\</kbd>)进行特殊字符转义
> - 区块的字串用缩排和修饰词(非必要)来和其他资料分隔,有新行保留(使用符号<kbd>|</kbd>)或新行折叠(使用符号<kbd>></kbd>)两种方式
> - 在单一档案中,可用连续三个连字号(<kbd>---</kbd>)区分多个档案
> - 可选择性的连续三个点号(<kbd>...</kbd>)用来表示档案结尾(在流式传输时非常有用,不需要关闭流即可知道到达结尾处)
> - 重复的内容可使从参考标记星号 (<kbd>*</kbd>)复制到锚点标记(<kbd>&</kbd>)
> - 指定格式可以使用两个惊叹号 ( !! ),后面接上名称
注意点:
(1),在YAML中必须使用空格进行缩进,不能使用tab
(2),使用一个跟着空格的“-”符号来声明一个序列。
- hosts
(3),使用一个跟着空格的冒号标记每一个键值对来声明一个散列表。
- hosts: websrc
(4),一个序列可以写成方括号 [] 中逗号分隔的列表形式;
[PHP,Perl,Python]
一个散列表可以写成大括号{}中逗号分隔的键值对列表的形式;
{ PHP: 5.2,MySQL: 5.5,Apache: 2.2.20}
(5),注释加#号
示例1: 安装apache,复制本地配置文件到远程主机,(当配置文件改变的时候触发notify重启httpd)启动httpd服务
vim /etc/ansible/hosts #定义配置文件
192.168.0.21
[web]
192.168.0.22
192.168.0.23
正常运行:
#ansible-playbook playbook1.yml
仅运行tags
#ansible-playbook playbook1.yml --tags=1
代码:
#playbook1.yml
- hosts: web
remote_user: root
vars:
- Sname1: httpd
- Sname2: mysql
tasks:
- name: install {{ Sname1 }}
yum: name={{ Sname1 }} state=latest #使用定义的变量
- name: copy config file
tags: 1 #仅运行copy config file,其他忽略。
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: #当配置文件改变的时候,触发notify,重启httpd,notify和之上的并列书写。
- restart httpd
- name: start httpd
service: name=httpd state=started
- name: install {{ Sname2 }} on node3
yum: name=mysql-server state=latest
when: ansible_hostname == "node3" #只给主机名为node3的安装mysql-server,ansible_hostname为(ansible web -m setup获取的变量信息)
- name: add several users #迭代,当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句来指明迭代的元素列表即可
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
handlers:
- name: restart httpd
service: name=httpd state=restarted
三,Templates 的使用(模板的使用)
使用场合:
在web这个组中 192.168.0.22 和192.168.0.23 ,22需要监听httpd服务为80端口,而23需要监听8080端口,两个端口,最大连接数,主机名都不一样,之前的方法copy本地配置文件,配置文件是一致的,不能实现,所有需要使用Templates。
思路:
1,在模板文件内定义变量。
2,在配置文件主机定义不同主机需要的变量。(这样可以在不同主机匹配到配置文件的时候使用的是不同的值)
3,配置playbook文件
1,在模板文件内定义变量。
#mkdir /templates
#cd /templates
#mv /etc/httpd/conf/httpd.conf ./httpd.conf.j2 #模板文件
#vim httpd.conf.j2
#定义替换的变量:
ServerName {{ ansible_fqdn }} #setup获取的自定义变量ansible_fqdn
Listen {{ http_port }}
MaxClients {{ MaxClients }}
2,在配置文件主机定义不同主机需要的变量值
# vim /etc/ansible/hosts
[web]
192.168.0.22 http_port=80 MaxClients=100
192.168.0.23 http_port=8080 MaxClients=200
3,配置playbook文件
四,roles使用
ansilbe自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在
playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用
于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。
所有的文件都放到file目录中,所有的模板都放到templates中,所有的taks都放到taks目录中,下来只是调用即可。
一个roles的案例如下所示:
site.yml 主调接口
webservers.yml
fooservers.yml
roles/
common/
files/
templates/
tasks/
handlers/
vars/
meta/
webservers/
files/
templates/
tasks/
handlers/
vars/
meta/
而在playbook中,可以这样使用roles:
---
- hosts: webservers
roles:
- common
- webservers
也可以向roles传递参数,例如:
---
- hosts: webservers
roles:
- common
- { role: foo_app_instance, dir: '/opt/a', port: 5000 }
- { role: foo_app_instance, dir: '/opt/b', port: 5001 }
甚至也可以条件式地使用roles,例如:
---
- hosts: webservers
roles:
- { role: some_role, when: "ansible_os_family == 'RedHat'" }
1 创建role的步骤
(1) 创建以roles命名的目录;
(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等;
(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;
(4) 在playbook文件中,调用各角色;
2 role内各目录中可用的文件
tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表;此文件可以使用include包含其它的位于此目录中的task文件;
files目录:存放由copy或script等模块调用的文件;
templates目录:template模块会自动在此目录中寻找Jinja2模板文件;
handlers目录:此目录中应当包含一个main.yml文件,用于定义此角色用到的各handler;在handler中使用include包含的其它的handler文件也应该位于此目录中;
vars目录:应当包含一个main.yml文件,用于定义此角色用到的变量;
meta目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系;ansible 1.3及其以后的版本才支持;
default目录:为当前角色设定默认变量时使用此目录;应当包含一个main.yml文件;
示例:
如下,使用playbook将会特别麻烦,不能进行模块话调用。
这样可以使用roles来完成以上的部署:
1 创建role的步骤
(1) 创建以roles命名的目录;
(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等;
(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;
(4) 在playbook文件中,调用各角色;
部署:
# vim /etc/ansible/hosts
192.168.0.21
[websrvs]
192.168.0.22
192.168.0.23
创建目录结构:web服务和数据库服务
# mkdir -pv /ansible_playbooks/roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers,vars}
# cp /etc/httpd/conf/httpd.conf /ansible_playbooks/roles/websrvs/files/ #用httpd.conf作为静态httpd配置文件,放在file目录中
# cd /ansible_playbooks/roles/websrvs/
#vim tasks/main.yml #定义tasks文件
# vim handlers/main.yml #定义handlers
#[root@node1 ansible_playbooks]# pwd
/ansible_playbooks
# vim site.yml 定义主要执行的文件
运行结果:
这样就给两台主机按需做了配置
实现模块化调用:
21 使用角色websrvs
22 使用dbsrvs
23 两个都安装。
# vim /ansible_playbooks/test.yml
配置dbsrvs
cp /etc/mysql/my.cnf roles/dbsrvs/files/
vim roles/dbsrvs/tasks/main.yml
vim roles/dbsrvs/handlers/main.yml
[root@node1 ansible_playbooks]# ansible-playbook test.yml 执行
roles:总结
(1) 目录名同角色名;
(2) 目录结构有固定格式:
files: 静态文件
templates: Jinjia2模板文件
tasks: 至少有main.yml文件,定义各tasks;
handlers:至少有一个main.yml文件,定义各handlers
vars: 至少有一个main.yml文件,定义变量
meta: 定义依赖关系等信息
(3) site.yml中定义playbook,额外也可以有其它的yml文件;