Ansible进阶之roles

olei 2,422 views 0

roles简介

一个项目从开始到结束,不是简单几十个playbook就可以完事了,当文件数很多,有上百个的话,仅通过简单的includes不停的引用,那最终的结果错综复杂。这个时候ansible roles就可以很好的发挥它的作用了。

roles,字面意思是角色的含义,可以理解为有相互关联功能的集合。我们把安装ntp、mem、nginx、db等等的功能角色放在一个大仓库里,然后用到哪个,从那里面去拿,拿一个,拿两个都可以。

roles是个目录,角色集合

roles功能可以用来规范playbook的编写

roles使用

创建所需要的roles原型目录结构

tree rolesbzh/   标准化目录 
rolesbzh/
├── nginx.retry #文件:/etc//ansible/hosts里的主机名
├── nginx.yaml   #文件:触发器,用来触发roles内的不同剧本
└── roles   #目录:里面存放不同的剧本目录
    └── nginx #目录:存放nginx剧本相关模块
        ├── files #目录:files存放copy模块和script模块的参数src默认会从这个文件夹查找
        │   ├── test  #要上传的文件
        │   └── test.sh #需要在目标主机执行的脚本
        ├── handlers #用来存放notify的,自定义动作
        │   └── main.yaml  
        ├── tasks #用来存放ansible任务的模块,ansible会根据里面写的执行过程进行剧本的执行
        │   └── main.yaml
        ├── templates #template模块的使用,用来存放可变配置文件j2的
        │   └── test.j2
        └── vars #用来存放变量的
            └── main.yaml

入口触发配置文件

ansible-playbook执行入口配置文件nginx.yaml后,它会自动在roles目录下查找nginx目录并进入后查找tasks任务目录并执行main.yaml的任务配置文件。

cat /root/rolesbzh/nginx.yaml 
---
- hosts: all              #执行的主机范围
  gather_facts: True      #开启系统内置变量
  roles:                  #启用roles原型配置
  - nginx                 #执行nginx原型模组,即roles里的nginx剧本

roles中tasks任务编排模组的使用

#在nginx模组添加tasks任务配置文件
vim /root/rolesbzh/roles/nginx/tasks/main.yaml
---
- name: ping          #任务1的名字  ping  (名字可有可无可随意)
  ping:               #执行ping
- name: 执行shell      #任务2的名字  执行shell
  shell: ls /         #执行ls查看跟目录      
  register: i         #将执行的结果带入一个变量i内
- debug: var=i        #将变量i输出出来
- name: 变量           #任务3的名字  变量
  shell: echo my name is {{ my_name }},{{ qq }}   #执行命令可调用vars变量
  register: I         #将执行的结果带入一个变量I内
- debug: var=I        #将变量I输出出来
- name: copy          #任务4的名字   copy
  copy: src=test dest=/root/        #将files目录下的test移动到目标主机的root下
- name: script        #任务5的名字   script
  script: test.sh     #在目标主机执行files目录下的test.sh脚本 
- name: 可变配置文件    #任务6的名字   可变配置文件
  template: src=test.j2 dest=/root/text1   #将templates目录下的test.j2文件移动到目标主机root目录下改名为text1  并将变量变为值
  notify: reload      #如果template发生变化则执行handles里的动作,如果template没有发生变化则不执行handles里的动作

roles中vars自定义变量模组的使用

#创建自定义变量vars模组的配置文件
vim /root/rolesbzh/roles/nginx/vars/main.yaml
---
my_name: wk   #变量my_name值wk
qq: 224901    #变量qq值224901

使用copy,script模块的标准化

roles模型里使用copy,script模块,默认从roles/nginx/files这里面找

vim //root/rolesbzh/roles/nginx/files/test         #files存放的文件
生死阔契

vim /root/rolesbzh/roles/nginx/files/test.sh       #files存放的脚本   files里的脚本在客户机执行完后会自行删除,等于无痕执行了一次脚本
echo "与子成说" > /tmp/test
chmod +x roles/nginx/files/test.sh

roles中template模块的使用

roles模型里使用template模块,默认从roles/nginx/template里面找

vim /root/rolesbzh/roles/nginx/templates/test.j2  
my name is {{ my_name }},my qq {{ qq }},my ip {{ansible_all_ipv4_addresses[0]}}   #引用自定义变量和内置变量

roles中notify模块的使用

roles使用notify模块,默认从roles/nginx/handles里面找

vim /root/rolesbzh/roles/nginx/handlers/main.yaml 
---
- name: start          #定义handlers的动作类型
  shell /usr/local/nginx/sbin/nginx
- name; stop           #定义handlers的动作类型
  shell /usr/local/nginx/sbin/nginx -s stop
- name; reload         #定义handlers的动作类型
  shell /usr/local/nginx/sbin/nginx -s reload

notify下发通知只有当之前的任务造成了变化那么才会被执行,如果没有发生任何改变,则notify不会被执行。

最后,运行

在rolesbzh目录下运行

ansible-playbook nginx.yaml

发表评论 取消回复
表情 图片 链接 代码

分享