一、基本概念
ansible role
是一种组织playbook
的方式,它将相关的任务、变量、配置文件、模板等组织到一个预定义的文件结构中。使用roles
可以使playbook
更加模块化、可重用和易于管理。
playbook
存在的问题
配置文件乱放
功能重复,太多冗余
所有的任务写在同一个文件里,容易修改错误,篇幅太长,没有按照功能拆分
Roles
的好处
模块化、代码复用
将相关任务、变量、文件和模板打包成独立单元
一次开发,多次使用
组织结构清晰
协作与维护
Role
的基本结构
role_name/ #目录
├── defaults/ # 默认变量 (最低优先级)
│ └── main.yml
├── vars/ # 其他变量 (较高优先级)
│ └── main.yml
├── tasks/ # 主任务列表
│ └── main.yml
├── handlers/ # 处理器
│ └── main.yml
├── files/ # 静态文件
├── templates/ # Jinja2 模板
├── meta/ # 角色依赖
│ └── main.yml
└── tests/ # 测试用例
二、 使用roles
实现NFS
构建
roles
目录编辑
tasks/main.yaml
# tasks/main.yml
- name: 01_install_nfs
yum:
name: nfs-utils
state: present
- name: 02_create_directory
file:
path: /data
state: directory
mode: "0777"
- name: 03_exports
copy:
src: exports
dest: /etc/exports
mode: "0777"
- name: 04_started_nfs
systemd:
name: nfs-server
state: started
enabled: yes
编辑
roles
的 playbook
# site.yml
- name: nfs_server
hosts: nfs_servers
roles:
- nfs_server
角色其实就是将我们原本的playbook进行了拆分,将不同的剧本结构放到不同的目录下,方便管理。
COPY涉及的文件可以放到files目录下,编写yaml时就可以使用相对路径了。
可以使用手动的方式创建,也可以在创建yaml之前通过命令行的方式提前创建出来。
创建Role
使用ansible-galaxy
命令创建role
骨架:
ansible-galaxy init role-name
示例:
创建role
骨架
ansible-galaxy init dir
# dir是一个自定义的目录,是我要执行的整个任务(角色)的目录。
[root@ansible1 ansible]# pwd
/etc/ansible
[root@ansible1 ansible]# tree .
.
├── ansible.cfg
├── hosts
└── roles
├── dir # 要执行的整个任务(角色)目录
│ ├── defaults
│ │ └── main.yml
│ ├── files
│ │ ├── test1.txt
│ │ ├── test2.txt
│ │ └── test3.txt
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── README.md
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ ├── tests
│ │ ├── inventory
│ │ └── test.yml
│ └── vars
│ └── main.yml
└── my-playbook.yaml
10 directories, 14 files
[root@ansible1 ansible]#
dir是一个自定义的目录,是我要执行的整个任务(角色)的目录。
my-playbook.yaml
[root@ansible1 roles]# pwd
/etc/ansible/roles
[root@ansible1 roles]# cat my-playbook.yaml
- name: make and copy
hosts: all
roles:
- dir
[root@ansible1 roles]#
tasks下的main.yaml
[root@ansible1 tasks]# pwd
/etc/ansible/roles/dir/tasks
[root@ansible1 tasks]# cat main.yml
---
# tasks file for dir
- name: create directory
file:
path: "{{ item.path }}"
owner: "{{ item.owner }}"
group: "{{ item.group }}"
mode: "{{ item.mode }}"
state: directory
loop:
- { path: '/root/ansible1', mode: '0777', owner: 'root', group: 'root' }
- { path: '/root/ansible2', mode: '0755', owner: 'root', group: 'root' }
- { path: '/root/ansible3', mode: '0644', owner: 'root', group: 'root' }
- name: create file
file:
path: "{{ item.path }}"
owner: "{{ item.owner }}"
group: "{{ item.group }}"
mode: "{{ item.mode }}"
state: touch
loop:
- { path: '{{ file_dir1 }}/file1.txt', mode: '0777', owner: 'root', group: 'root' }
- { path: '{{ file_dir2 }}/file2.txt', mode: '0755', owner: 'root', group: 'root' }
- { path: '{{ file_dir3 }}/file3.txt', mode: '0644', owner: 'root', group: 'root' }
- name: copy
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
owner: "{{ item.owner }}"
group: "{{ item.group }}"
mode: "{{ item.mode }}"
loop:
- { src: 'test1.txt',dest: '/root/ansible1/', mode: '0777', owner: 'root', group: 'root' }
- { src: 'test2.txt',dest: '/root/ansible2/', mode: '0755', owner: 'root', group: 'root' }
- { src: 'test3.txt',dest: '/root/ansible3/', mode: '0644', owner: 'root', group: 'root' }
- name: create file content
copy:
dest: "{{ item.dest }}"
mode: "{{ item.mode }}"
content: "{{item.content}}" # 使用copy并且同时写入内容是时,不需要src的参数
loop:
- { dest: '/root/ansible1/haha1.txt',mode: '0755', content: "This is haha1" }
- { dest: '/root/ansible2/haha2.txt',mode: '0755', content: "This is haha2" }
- { dest: '/root/ansible3/haha3.txt',mode: '0755', content: "This is haha3" }
[root@ansible1 tasks]#
vars下的main.yamk
[root@ansible1 vars]# pwd
/etc/ansible/roles/dir/vars
[root@ansible1 vars]# cat main.yml
---
# vars file for dir
dir: "/root"
file_dir1: "{{ dir }}/ansible1"
file_dir2: "{{ dir }}/ansible2"
file_dir3: "{{ dir }}/ansible3"
[root@ansible1 vars]#
files下的文件
[root@ansible1 files]# pwd
/etc/ansible/roles/dir/files
[root@ansible1 files]# ll
总用量 0
-rw-r--r--. 1 root root 0 7月 2 05:22 test1.txt
-rw-r--r--. 1 root root 0 7月 2 05:22 test2.txt
-rw-r--r--. 1 root root 0 7月 2 05:22 test3.txt
[root@ansible1 files]#