playbook role应用
参考: ansible中文权威指南
1. 动态Include
结合when等判断,在满足某个条件的时候加载。
- include: test.yml
when: ......
handler 中也可以使用include
2. ansible role 结构
roles目录结构一般如下,可以根据实际情况减少:
. ├── group_vars #定义主机组的变量,虽然可以写在playbook和hosts中,但是提倡分离.文件用组名命名. │ ├── all.yml │ ├── seawar_server.yml │ ├── seawar.yml │ └── test1.yml ├── hosts ├── host_vars #定义特定主机的变量,文件以主机命名, │ └── ios-cn-58.yml ├── main.yml #整个playbook的入口文件,组织多个role的任务执行。任务总调度文件。主要指定远程主机,执行用户,调用的roles等。 └── roles ├── base #roles的名字 │ ├── files #存放要传输文件的目录,不用在tasks/main.yml中写绝对路径就可以用 │ │ └── server.sh │ ├── handlers │ │ └── main.yml │ ├── meta │ ├── tasks │ │ ├── fileup.yml #分离出来的任务,main.yml中include直接引用。 │ │ ├── main.yml #任务主函数,整个role的任务入口。 │ │ └── sql.yml #分离出来的任务,main.yml中include直接引用。 │ ├── templates # 模版文件,一般用于配置文件的变更 │ └── vars # 变量 │ └── main.yml #一般定义templates中要用到的变量 └── create_dir.sh
roles说明:
这个 playbook 为一个角色 ‘x’ 指定了如下的行为:
- 如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中
- 如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
- 如果 roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
- 如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中 (1.3 and later)
- 所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路径。
- 所有 script tasks 可以引用 roles/x/files/ 中的脚本,不需要指明文件的路径。
- 所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路径。
- 所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路径。
hosts定义如下:
[ios_cn] iOS-CN-1-16 iOS-CN-17-32 iOS-CN-33-52 iOS-CN-53-54 iOS-CN-55-56 iOS-CN-57 iOS-CN-58 [ios_tw] 121.40.20.132 [an_360] 360-1 360-2 360-3 [googleplay] android-TW-1-6 [jp_ios] gNetop-iOS-JP-1-2 gNetop-iOS-JP-3-5 gNetop-iOS-JP-6-9 gNetop-iOS-JP-10-11 gNetop-iOS-JP-12-13 gNetop-iOS-JP-14-17 gNetop-iOS-JP-18-22 gNetop-iOS-JP-23-24 gNetop-iOS-JP-25 [jp_an] gNetop-android-JP-1-4 gNetop-android-JP-5-8 gNetop-android-JP-9-10 gNetop-android-JP-11 [na] gNetop-NA-S1 gNetop-NA-S2 gNetop-NA-S3 gNetop-NA-39 [eu] gNetop-EU-1 gNetop-EU-2 gNetop-EU-3 [sea] gNetop-SEA-M1 gNetop-SEA-M2 [seawar_server:children] ios_cn ios_tw jp_ios na eu sea [seawar:children] googleplay an_360 jp_an [test] 172.10.30.239 [test1:children] test
变量定义如下: group_vars/all.yml .应用于所有主机的变量
--- back_dir: "/mnt/back_2015/"
playbook 入口文件main.yml 定义如下:
--- - hosts: jp_ios remote_user: root #登录远程机器的用户, roles: - u_776
roles/tasks中的文件如下:
--- - name: 上传数据库文件 copy: src: "{{item.src}}" dest: "{{item.dest}}" owner: root group: root mode: 0755 with_items: - { src: server.sql, dest: "{{back_dir}}" } - { src: server.sh, dest: "{{back_dir}}" } - name: 执行数据库文件 shell: sh "{{back_dir}}"server.sh>server.txt chdir = "{{back_dir}}" #使用变量用引号。 sh命令去执行脚本。也可以在shell中直接执行命令。
--- - name: 更新文件 copy: src: "{{item.src}}" dest: "{{item.dest}}" with_items: - { src: init, dest: "{{remote_dir}}" } - { src: app, dest: "{{remote_dir}}" }
---
- include: fileup.yml
#- include: sql.yml
3. 跨平台roles,when判断实现
比如 redhat和ubuntu都要安装httpd.
首先定义两个roles httpd_ubuntu, httpd_redhat. 调用主文件如下:
--- - name: cross-platform install httpd hosts: cross-platfoem roles: #通过facts自动收集的信息结合when判断来执行 - {role: httpd_ubuntu, when: ansible_os_family="Ubuntu"} - {role: httpd_redhat, when: ansible_os_family="RedHat"}
4. jinja2 模版自定义
https://www.jianshu.com/p/ae74f5f39828
二、ansible的roles介绍: ansible的roles用于层次性、结构化地组织palybook。roles能够根据层次型结构自动装载变量文件、tasks及handlers等。要使用roles只需要playbook中使用include指令即可。 rules的组成: root@node1 playbook]# tree roles/ roles/ \\ansible所有的信息都放到此目录下面对应的目录中 └── nginx \\角色名称 ├── default \\为当前角色设定默认变量时使用此目录,应当包含一个main.yml文件; ├── files \\存放有copy或script等模块调用的文件 ├── handlers \\此目录总应当包含一个main.yml文件,用于定义各角色用到的各handler ├── meta \\应当包含一个main.yml,用于定义角色的特殊设定及其依赖关系;1.3及以后版本支持 ├── tasks \\至少包含一个名为main.yml的文件,定义了此角色的任务列表,可使用include指令 ├── templates \\template模块会自动在此目录中寻找Jinja2模板文件 └── vars \\应当包含一个main.yml文件,用于定义此角色用到的变量 roles介绍完了,那么我们就利用ansible的roles来配置nginx 1、首先按照上面的要求创建要用到的目录 [root@node1 playbook]# mkdir -pv roles/nginx/{tasks,files,templates,handlers,vars,meta,default} 2、准备nginx配置文件 准备nginx.conf配置文件,使用模板文件配置 [root@node1 playbook]# cd roles/nginx/templates/ [root@node1 ~]# ansible all -m setup | grep ansible_processor_cores "ansible_processor_cores": 1, \\获取ansible的要调用的相关函数 [root@node1 playbook]# cd roles/nginx/templates/ \\模板文件一定要放到此目录 [root@node1 templates]# vim nginx.conf worker_processes {{ ansible_processor_cores }}; \\调用获取到的函数 准备nginx的default.conf文件 [root@node1 playbook]# ls -l roles/nginx/files/ -rw-r--r--. 1 root root 1290 Nov 12 2014 default.conf 3、准备nginx的rpm包 [root@node1 playbook]# ls -l roles/nginx/files/ -rw-r--r--. 1 root root 1290 Nov 12 2014 default.conf -rw-r--r--. 1 root root 319456 Mar 29 20:44 nginx-1.4.7-1.el6.ngx.x86_64.rpm 4、在tasks目录中配置任务列表 [root@node1 playbook]# cd roles/nginx/tasks/ [root@node1 tasks]# vim main.yml - name: copy nginx.rpm copy: src=nginx-1.4.7-1.el6.ngx.x86_64.rpm dest=/tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm - name: install nginx shell: yum -y install /tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm - name: provides nginx.conf template: src=nginx.conf dest=/etc/nginx/nginx.conf tags: nginxconf notify: - server restart - name: provides default.conf copy: src=default.conf dest=/etc/nginx/conf.d/default.conf tags: nginxconf - name: server start service: name=nginx enabled=true state=started 5、在handlers目录中配置定义handler信息 [root@node1 playbook]# cd roles/nginx/handlers/ [root@node1 handlers]# vim main.yml - name: server restart service: name=nginx state=restarted 6、在roles同一级目录中创建site.yml文件 [root@node1 playbook]# cat site.yml - hosts: nginx remote_user: root roles: - nginx 7、应用配置: [root@node1 playbook]# ansible-playbook site.yml
一搭搭
二搭搭
三搭搭