Ansible 进阶之 roles

olei 2,601 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

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

分享