linux-ansible-05 ansible-playbook-roles

linux-ansible-05 ansible-playbook-roles

通过playbook角色目录(roles)安装apache

  前面写过了ansible常用的模块介绍,熟悉这些模块是基础,接下来我们通过一个实例来介绍playbook,playbook通过灵活的组装这些基础模块组件,可以适应各种复杂的业务操作场景。

  在上一篇文章中,我们给出了角色目录文件结构tree的官方案例,现在我们将它实现出来自己做一个案例,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@test ~]# cd /etc/ansible/
[root@test ansible]#
[root@test ansible]# yum install tree -y
[root@test ansible]# tree roles/
roles/
├── httpd
│   ├── defaults
│   ├── files
│   │   └── index.html
│   ├── handlers
│   │   └── main.yaml
│   ├── metas
│   ├── tasks
│   │   └── main.yaml
│   ├── templates
│   │   └── vhost1.conf.j2
│   └── vars
│   └── main.yaml
└── httpd.yaml

8 directories, 6 files
[root@test ansible]#

在roles文件夹里,创建httpd文件夹以及httpd.yaml,编辑httpd.yaml内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@test ~]# cd /etc/ansible/roles
[root@test roles]#
[root@test roles]# ls
[root@test roles]# mkdir httpd
[root@test roles]# vim httpd.yaml
[root@test roles]# cat httpd.yaml
- hosts: node3
remote_user: root
roles:
- httpd

[root@test roles]# ls
httpd httpd.yaml
[root@test roles]#

在httpd目录下创建所需要的所有目录

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@test roles]# cd httpd
[root@test httpd]# ls
[root@test httpd]# mkdir {defaults,tasks,vars,templates,handlers,files,metas} -pv
mkdir: created directory ‘defaults’
mkdir: created directory ‘tasks’
mkdir: created directory ‘vars’
mkdir: created directory ‘templates’
mkdir: created directory ‘handlers’
mkdir: created directory ‘files’
mkdir: created directory ‘metas’
[root@test httpd]# ls
defaults files handlers metas tasks templates vars
[root@test httpd]#

在files目录下创建默认页面,里面随便写一句话就好,我写的是hello ansible !

1
2
3
4
5
6
[root@test httpd]# cd files/
[root@test files]# vim index.html
[root@test files]# cat index.html
hello ansible !
[root@test files]# cd ..
[root@test httpd]#

在handlers目录下创建并且编辑main.yaml,如下

1
2
3
4
5
6
7
8
[root@test httpd]# cd handlers/
[root@test handlers]# ls
[root@test handlers]# vim main.yaml
[root@test handlers]# cat main.yaml
- name: reload httpd
service: name=httpd state=reloaded
[root@test handlers]# cd ..
[root@test httpd]#

在tasks目录下创建并且编辑main.yaml,如下

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
[root@test httpd]# cd tasks/
[root@test tasks]# ls
[root@test tasks]# vim main.yaml
[root@test tasks]# cat main.yaml
- name: config hostname
command: hostnamectl set-hostname {{ hostname }}
- name: config resolv file
copy: src=/etc/resolv.conf dest=/etc/resolv.conf
- name: install service httpd
yum: name=httpd state=latest
- name: config httpdconf
template:
src: vhost1.conf.j2
dest: /etc/httpd/conf.d/vhost1.conf
notify:
- reload httpd
- name: disable selinux
selinux: state=disabled
- name: config vhost1 index.html
copy: src=index.html dest=/var/www/
- name: firewalld ports
command: firewall-cmd --add-port={{ port }}/tcp
- name: start httpd
service: name=httpd state=started enabled=yes
[root@test tasks]# cd ..
[root@test httpd]#

在templates目录下创建并且编辑vhost1.conf.j2,如下

1
2
3
4
5
6
7
8
9
10
11
[root@test httpd]# cd templates/
[root@test templates]# ls
[root@test templates]# vim vhost1.conf.j2
[root@test templates]# cat vhost1.conf.j2
Listen {{ port }}
<VirtualHost *:{{ port }}>
Servername {{ hostname }}
DocumentRoot "/var/www/"
</VirtualHost>
[root@test templates]# cd ..
[root@test httpd]#

在vars目录下创建并且编辑main.yaml,如下

1
2
3
4
5
6
7
8
9
[root@test httpd]# cd vars/
[root@test vars]# ls
[root@test vars]# vim main.yaml
[root@test vars]# cat main.yaml
port: 8080
hostname: node3

[root@test vars]# cd ..
[root@test httpd]#

回到roles目录下,执行httpd.yaml,可以看到执行成功

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
[root@test httpd]# cd ..
[root@test roles]# ls
httpd httpd.yaml
[root@test roles]# ansible-playbook httpd.yaml
[WARNING]: Found variable using reserved name: port


PLAY [node3] *********************************************************************************************************

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

TASK [httpd : config hostname] ***************************************************************************************
changed: [node3]

TASK [httpd : config resolv file] ************************************************************************************
ok: [node3]

TASK [httpd : install service httpd] *********************************************************************************
ok: [node3]

TASK [httpd : config httpdconf] **************************************************************************************
ok: [node3]

TASK [httpd : disable selinux] ***************************************************************************************
[WARNING]: SELinux state change will take effect next reboot

ok: [node3]

TASK [httpd : config vhost1 index.html] ******************************************************************************
ok: [node3]

TASK [httpd : firewalld ports] ***************************************************************************************
changed: [node3]

TASK [httpd : start httpd] *******************************************************************************************
ok: [node3]

PLAY RECAP ***********************************************************************************************************
node3 : ok=9 changed=2 unreachable=0 failed=0

[root@test roles]#

注意:2.4版本的ansible的task/main.yaml的notify配置时,因为dict不可哈希,所以采用

1
2
notify:
- name: restart apache

时会报错:

ERROR! Unexpected Exception, this is probably a bug: unhashable type: ‘dict’
如何遇到此类问题,是因为dict不可哈希,所以notify在配置下,使用可哈希数据类型即可

1
2
notify:
- restart apache

上面的配置使用的是不报错的- restart apache,能够一次性执行成功!

  测试给node3安装apache后的结果,浏览器访问node3的主页,可以看到我们之前给node3的index.html内写入的hello ansible !

1
http://192.168.141.69:8080/
欢迎打赏,谢谢
------ 本文结束------
0%