侧边栏壁纸
  • 累计撰写 73 篇文章
  • 累计创建 23 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

【Ansible】Ansible角色

Administrator
2025-06-26 / 0 评论 / 0 点赞 / 20 阅读 / 7308 字 / 正在检测是否收录...

一、基本概念

ansible role是一种组织playbook的方式,它将相关的任务、变量、配置文件、模板等组织到一个预定义的文件结构中。使用roles可以使playbook更加模块化、可重用和易于管理。

playbook存在的问题

  1. 配置文件乱放

  2. 功能重复,太多冗余

  3. 所有的任务写在同一个文件里,容易修改错误,篇幅太长,没有按照功能拆分

Roles的好处

  1. 模块化、代码复用

  • 将相关任务、变量、文件和模板打包成独立单元

  • 一次开发,多次使用

  1. 组织结构清晰

  2. 协作与维护

Role的基本结构

role_name/	#目录
├── defaults/          # 默认变量 (最低优先级)
│   └── main.yml
├── vars/             # 其他变量 (较高优先级)
│   └── main.yml
├── tasks/            # 主任务列表
│   └── main.yml
├── handlers/         # 处理器
│   └── main.yml
├── files/            # 静态文件
├── templates/        # Jinja2 模板
├── meta/             # 角色依赖
│   └── main.yml
└── tests/            # 测试用例

二、 使用roles实现NFS

  1. 构建roles目录

  2. 编辑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
  1. 编辑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]#

0
博主关闭了所有页面的评论