ansible系列之五:role角色与实例

如果将所有的play都写在一个playbook中,很容易导致这个playbook文件变得臃肿庞大,且不易读。因此,可以将多个不同任务分别写在不同的playbook中,然后使用include将其包含进去即可。而role则是整合playbook的方式。无论是include还是role,其目的都是分割大playbook以及复用某些细化的play甚至是task。

roles说明

roles意为角色,主要用于封装playbook实现复用性。在ansible中,roles通过文件的组织结构来展现。

首先需要有一个roles目录。同时,在roles目录所在目录中,还要有一个playbook文件,此处为nginx.yml,nginx.yml文件是ansible-playbook需要执行的文件,在此文件中定义了角色,当执行到角色时,将会到roles中对应的角色目录中寻找相关文件。

roles目录中的子目录是即是各个role。例如,此处只有一个名为halo的role,在role目录中,有几个固定名称的目录(如果没有则忽略)。在这些目录中,还要有一些固定名称的文件,除了固定名称的文件,其他的文件可以随意命名。以下是各个目录的含义:

  • tasks目录:存放task列表。若role要生效,此目录必须要有一个主task文件main.yml,在main.yml中可以使用include包含同目录(即tasks)中的其他文件。
  • handlers目录:存放handlers的目录,若要生效,则文件必须名为main.yml文件。
  • files目录:在task中执行copy或script模块时,如果使用的是相对路径,则会到此目录中寻找对应的文件。
  • templates目录:在task中执行template模块时,如果使用的是相对路径,则会到此目录中寻找对应的模块文件。
  • vars目录:定义专属于该role的变量,如果要有var文件,则必须为main.yml文件。
  • defaults目录:定义角色默认变量,角色默认变量的优先级最低,会被任意其他层次的同名变量覆盖。如果要有var文件,则必须为main.yml文件。
  • meta目录:用于定义角色依赖,如果要有角色依赖关系,则文件必须为main.yml。

所以,相对完整的role的文件组织结构如下图。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
├── roles
│   ├── halo
│   │   ├── defaults
│   │   ├── files
│   │   ├── handlers
│   │   │   └── main.yml
│   │   ├── meta
│   │   │   └── main.yml
│   │   ├── tasks
│   │   │   └── main.yml
│   │   ├── templates
│   │   └── vars
│   │   └── main.yml
└── site.yml

实例

使用role的方式来安装halo,相对来说,结构会比较清晰明了。还是使用ansible去自动部署halo博客系统。功能很简单,就是在一台机器上面自动部署java+halo+nginx服务。目录如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
├── roles
│   ├── halo
│   │   ├── tasks
│   │   │   └── main.yml
│   │   ├── templates
│   │   │   ├── application.yaml
│   │   │   └── halo.service
│   │   └── vars
│   │   └── main.yml
│   ├── java
│   │   └── tasks
│   │   └── main.yml
│   └── nginx
│   ├── meta
│   │   └── main.yml
│   ├── tasks
│   │   └── main.yml
│   └── templates
│   └── halo.conf
└── site.yml

主要分为3个role,由site.yml引入,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# cat site.yml
---
- hosts: 192.168.1.61
remote_user: root
strategy: free
pre_tasks:
- name: config nginx repo for centos 7
yum_repository:
name: nginx
description: nginx
baseurl: http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck: no
when: ansible_distribution_major_version == "7"
- name: Disable SELinux
selinux: state=disabled

roles:
- nginx

post_tasks:
- shell: echo 'Deplay halo finished.'
register: ret
- debug: var=ret.stdout

pre_tasks为运行play之前的操作,post_tasks为运行完play之后的操作。主要是看nginx这个role的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@localhost nginx]# cat tasks/main.yml
---
- name: make sure nginx state is installed
yum: name=nginx state=installed
- name: copy halo to nginx config file
template: src=halo.conf dest="/etc/nginx/conf.d/halo.conf"
- name: make sure nginx service is running
service: name=nginx state=started
- name: make sure port is open
wait_for: port="{{ nginx_port }}"

[root@localhost nginx]# cat meta/main.yml
---
dependencies:
- role: java
- role: halo

[root@localhost nginx]# cat templates/halo.conf
server {
listen 80;

server_name {{ halo_domain }};

client_max_body_size 1024m;

location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://127.0.0.1:{{halo_port}}/;
}
}

meta/main.yml为role的依赖关系,要先运行这里面的内容才会运行自己的nginx这个role。

java这个role很简单,只需要安装jdk即可。

1
2
3
4
[root@localhost java]# cat tasks/main.yml
---
- name: install java
yum: name=java-1.8.0-openjdk state=installed

而halo的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@localhost halo]# cat tasks/main.yml
---
- name: get halo
get_url: url=http://halo.ryanc.cc/release/halo-latest.jar dest={{ halopath }}

- name: add halo service file
template: src=halo.service dest=/etc/systemd/system/halo.service

- name: touch ~/.halo directory
file: path=~/.halo state=directory

- name: copy halo config file
template: src=application.yaml dest="~/.halo/application.yaml"

- name: restart halo
systemd:
daemon_reload: yes
name: halo
state: started
enabled: yes

- name: wait to start halo
wait_for: port={{ halo_port }}
[root@localhost halo]# cat vars/main.yml
---
memory: 512m
halo_port: 8080
halopath: /root/halo.jar

运行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
[root@localhost halo]# ansible-playbook site.yml

PLAY [192.168.1.61] *********************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************
ok: [192.168.1.61]

TASK [config nginx repo for centos 7] ***************************************************************************************************************************
ok: [192.168.1.61]

TASK [Disable SELinux] ******************************************************************************************************************************************
ok: [192.168.1.61]

TASK [java : install java] **************************************************************************************************************************************
ok: [192.168.1.61]

TASK [halo : get halo] ******************************************************************************************************************************************
changed: [192.168.1.61]

TASK [halo : add halo service file] *****************************************************************************************************************************
ok: [192.168.1.61]

TASK [halo : touch ~/.halo directory] ***************************************************************************************************************************
ok: [192.168.1.61]

TASK [halo : copy halo config file] *****************************************************************************************************************************
ok: [192.168.1.61]

TASK [halo : restart halo] **************************************************************************************************************************************
ok: [192.168.1.61]

TASK [halo : wait to start halo] ********************************************************************************************************************************
ok: [192.168.1.61]

TASK [nginx : make sure nginx state is installed] ***************************************************************************************************************
ok: [192.168.1.61]

TASK [nginx : copy halo to nginx config file] *******************************************************************************************************************
changed: [192.168.1.61]

TASK [nginx : make sure nginx service is running] ***************************************************************************************************************
changed: [192.168.1.61]

TASK [nginx : make sure port is open] ***************************************************************************************************************************
ok: [192.168.1.61]

TASK [command] **************************************************************************************************************************************************
changed: [192.168.1.61]

TASK [debug] ****************************************************************************************************************************************************
ok: [192.168.1.61] => {
"ret.stdout": "Deplay halo finished."
}

PLAY RECAP ******************************************************************************************************************************************************
192.168.1.61 : ok=16 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

附ansible halo压缩包的下载地址:halo.tar.gz

  • 本文作者: wumingx
  • 本文链接: https://www.wumingx.com/linux/ansible-roles.html
  • 本文主题: ansible系列之五:role角色与实例
  • 版权声明: 本站所有文章除特别声明外,转载请注明出处!如有侵权,请联系我删除。
0%