当前位置: 首页 > 工具软件 > Ansible > 使用案例 >

Ansible 系列之 Ansible 角色

虞唯
2023-12-01

Ansible 角色(Roles)介绍

Ansible 自1.2版本引入的新特性,用于层次性、结构化地组织 Playbook。
Roles 能够根据层次型结构自动装载变量(vars)文件、tasks 以及 handlers 等。

简单来讲,Roles 就是分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的调用它们的一种机制。

从表面上看,Roles 就是一个目录。目录的名字也就是 Role 的名字。例如:

[root@wpf roles]# tree ./
./
└── nginx   #角色项目名称
    ├── defaults   #为当前角色设定默认变量
    │   └── main.yml
    ├── files   #存放由copy模块或script模块调用的文件
    ├── handlers   #定义此角色中触发条件时执行的动作
    │   └── main.yml
    ├── tasks   #定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。
    │   └── main.yml
    ├── templates   #存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。
    ├── vars   #定义此角色用到的变量
    │   └── main.yml
    └── meta   #为此角色定义一些元数据
        └── main.yml

注意: defaults、handlers、tasks、vars、meta,这几个子目录里面必须包含一个main.yml文件。

PS: 角色必须至少包含这些目录之一,但是最好排除任何未使用的目录。
·

制作一个 Role

·

分解的 Playbook

---
- name: task control playbook example
  hosts: wpf002
  vars: 
    createuser: 
      - tomcat
      - www
      - mysql
  tasks:
    - name: create user
      user: name="{{ item }}" state=present
      with_items: "{{ createuser }}"
      
    - name: yum install nginx 
      yum: name=nginx state=installed
      
    - name: update nginx config
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf backup=yes
      tags: updateconfig
      notify: reload nginx server
      
    - name: add nginx virtualhost config
      copy: src=wpf.com.conf dest=/etc/nginx/conf.d/
      tags: updateconfig
      notify: reload nginx server
      
    - name: check nginx running
      stat: path=/var/run/nginx.pid
      register: nginxrunning
      tags: updateconfig
 
    - name: check nginx syntax
      shell: /usr/sbin/nginx -t
      register: nginxsyntax
      tags: updateconfig

    - name: start nginx
      systemd: name=nginx state=started
      when: nginxsyntax.rc == 0 and nginxrunning.stat.exists == false
      tags: updateconfig
 
  handlers:
    - name: reload nginx server
      systemd: name=nginx state=reloaded
      when: nginxsyntax.rc == 0 and nginxrunning.stat.exists == true
      tags: updateconfig

·

命名 Role 的名字为 nginx

[root@wpf ~]# cd /etc/ansible/roles/
[root@wpf roles]# mkdir -p nginx/{vars,tasks,template,handlers,files}
[root@wpf roles]# touch nginx/{vars,tasks,handlers}/main.yml
[root@wpf roles]# tree nginx/
nginx/
├── files
├── handlers
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
└── vars
    └── main.yml

·
files 文件夹存放文件

[root@wpf ~]# mv wpf.com.conf /etc/ansible/roles/nginx/files/

·

templates 文件夹存放模板

[root@wpf ~]# mv nginx.conf.j2 /etc/ansible/roles/nginx/templates/

·
handlers 文件夹中的 main.yml 文件

cat << EOF > /etc/ansible/roles/nginx/handlers/main.yml
---
- name: reload nginx server
  systemd: name=nginx state=reloaded
  when: nginxsyntax.rc == 0 and nginxrunning.stat.exists == true
EOF

·
tasks 文件夹中的 main.yml 文件

cat << EOF > /etc/ansible/roles/nginx/tasks/main.yml
---
- name: create user
  user: name="{{ item }}" state=present
  with_items: "{{ createuser }}"
  
- name: yum install nginx 
  yum: name=nginx state=installed
  
- name: update nginx config
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf backup=yes
  tags: updateconfig
  notify: reload nginx server
  
- name: add nginx virtualhost config
  copy: src=wpf.com.conf dest=/etc/nginx/conf.d/
  tags: updateconfig
  notify: reload nginx server
  
- name: check nginx running
  stat: path=/var/run/nginx.pid
  register: nginxrunning
  tags: updateconfig

- name: check nginx syntax
  shell: /usr/sbin/nginx -t
  register: nginxsyntax
  tags: updateconfig

- name: start nginx
  systemd: name=nginx state=started
  when: nginxsyntax.rc == 0 and nginxrunning.stat.exists == false
  tags: updateconfig
EOF

·
vars 文件夹中的 main.yml 文件

cat << EOF > /etc/ansible/roles/nginx/vars/main.yml
---
createuser:
  - tomcat
  - www
  - mysql
EOF

·

在 Playbook 中使用 Role

Role 本身不能被直接执行,还是需要借助 Playbook 进行间接的调用。

原始方式

- name: a playbook used role
  hosts: wpf002
  roles:
    - nginx

新方式

在 Playbook 中给定 import_role 属性。这种方式适用于 Ansible 2.4 及以上。

- name: use rose
  hosts: wpf002
  tasks: 
    - debug: 
        msg: "Start execution nginx role"
    - import_role: 
        name: nginx
    - debug: 
        msg: "nginx role implement finish"
 类似资料: