Linux下自动化运维工具之ansible角色的使用(6)

                                              利用角色简化playbook

我们知道ansible可以自定义模块,便于自己或他人调用,它也有一个特有的名称叫做角色。每个角色对应的服务可能不太一样,比如mysql,httpd,nginx,memcached。虽然每个角色(模块)的功能不一样,但是他们都以特定的目录结构进行组织。
一、ansible角色具有以下优点
1.角色可以把内容分组,容易重复使用
2.可以用角色定义系统的基本信息:web服务器、数据库服务器等
3.角色可以是大型项目更加方便容易管理
4.可以由多人并行开发

ansible角色会把不同功能的playbook分开,一个标准的角色含有以下子目录
defaults:   其中的main.yml包含角色变量的默认值   (在所有变量中优先级最低)
files:     包含角色任务引用的的静态文件
handlers:  主要定义处理程序
meta:      角色相关信息,如作者、许可证等
tasks:      定义任务
template:  任务引用的jinja2模板
test:      可以包含清单和test.yml的playbook,用于测试
vars:      定义角色变量

二、在角色中使用ansible的角色
1.如下所示

---
- hosts: servera.lab.example.com
  roles:
    - role1:
    - role2:            var2定义两个变量,任何defaults和vars中制定的变量都将被覆盖
       var1: var1
       var2: var2

2.控制执行程序
有时候需要在角色之前或之后执行一些任务
关键字:
之前执行任务:pre_tasks
之后执行任务: post_tasks
3.安装系统角色

[root@workstation ~]# yum install -y rhel-system-roles

4.安装角色的位置

[root@workstation ~]# ls -l /usr/share/ansible/roles
total 0
lrwxrwxrwx.  1 root root  23 Jan 14  2019 linux-system-roles.kdump -> rhel-system-roles.kdump
lrwxrwxrwx.  1 root root  25 Jan 14  2019 linux-system-roles.network -> rhel-system-roles.network
lrwxrwxrwx.  1 root root  25 Jan 14  2019 linux-system-roles.postfix -> rhel-system-roles.postfix
lrwxrwxrwx.  1 root root  25 Jan 14  2019 linux-system-roles.selinux -> rhel-system-roles.selinux
lrwxrwxrwx.  1 root root  26 Jan 14  2019 linux-system-roles.timesync -> rhel-system-roles.timesync
drwxr-xr-x.  9 root root 173 Apr 14 13:59 rhel-system-roles.kdump
drwxr-xr-x.  8 root root 196 Apr 14 13:59 rhel-system-roles.network
drwxr-xr-x.  6 root root 114 Apr 14 13:59 rhel-system-roles.postfix
drwxr-xr-x.  7 root root 139 Apr 14 13:59 rhel-system-roles.selinux
drwxr-xr-x. 10 root root 188 Apr 14 13:59 rhel-system-roles.timesync
查看其中网略角色
[root@workstation ~]# ls -l /usr/share/ansible/roles/rhel-system-roles.network/
total 116
drwxr-xr-x. 2 root root    22 Apr 14 13:59 defaults
drwxr-xr-x. 2 root root    36 Apr 14 13:59 library
-rw-r--r--. 1 root root  1510 Oct 16  2018 LICENSE
drwxr-xr-x. 2 root root    22 Apr 14 13:59 meta
drwxr-xr-x. 3 root root    25 Apr 14 13:59 module_utils
-rw-r--r--. 1 root root 16812 Oct 16  2018 pylintrc
-rw-r--r--. 1 root root 58144 Jan 14  2019 README.html
-rw-r--r--. 1 root root 22491 Oct 16  2018 README.md
drwxr-xr-x. 2 root root    22 Apr 14 13:59 tasks
drwxr-xr-x. 5 root root  4096 Apr 14 13:59 tests
-rw-r--r--. 1 root root  2886 Oct 16  2018 tox.ini

五.时间同步角色练习
查看系统当中那些角色可以使用

[root@workstation ~]# ansible-galaxy list
# /usr/share/ansible/roles
- linux-system-roles.kdump, (unknown version)
- linux-system-roles.network, (unknown version)
- linux-system-roles.postfix, (unknown version)
- linux-system-roles.selinux, (unknown version)
- linux-system-roles.timesync, (unknown version)
- rhel-system-roles.kdump, (unknown version)
- rhel-system-roles.network, (unknown version)
- rhel-system-roles.postfix, (unknown version)
- rhel-system-roles.selinux, (unknown version)
- rhel-system-roles.timesync, (unknown version)
# /etc/ansible/roles
 [WARNING]: - the configured path /root/.ansible/roles does not exist.

6.查看帮助

[root@workstation roles]# cat  /usr/share/doc/rhel-system-roles/timesync/README.md 
...................
``yaml
- hosts: targets
  vars:
    timesync_ptp_domains:
      - number: 0
        interfaces: [ eth0 ]
  roles:
    - rhel-system-roles.timesync
    - .....................

7.时区设置的例子

[root@workstation roles]# ansible-doc timezone | grep -A 4 "EXAMPLES"
EXAMPLES:

- name: Set timezone to Asia/Tokyo
  timezone:
    name: Asia/Tokyo

8.清单和配置文件

[root@workstation roles]# ls
ansible.cfg  group_vars  inventory
[root@workstation roles]# cat ansible.cfg 配置文件
[defaults]
inventory = ./inventory
[root@workstation roles]# vim inventory 
[root@workstation roles]# cat inventory 清单
[group1]
servera.lab.example.com
[group2]
serverb.lab.example.com


[groups:children]
group1
group2

9.创建针对主机的变量目录和新建时间yml

创建:groups目录下的group1和group2
root@workstation group_vars]# ls
group1  group2
[root@workstation group_vars]# cat group1/timezone.yml 
host_timezone: Asia/Shanghai     上海
[root@workstation group_vars]# cat group2/timezone.yml
host_timezone: Europe/London      伦敦

10.创建主playbook并运行

[root@workstation group_vars]# ansible-playbook   configure_time.yml 
---
- name: Time Sync   时间同步
  hosts: groups     指定受管主机嵌套组
  roles:          指定角色
    - rhel-system-roles.timesync   时间角色
  post_tasks:         角色之后运行的任务
    - name: Set Timezone       设置时区
      timezone:               时区
        name: "{{ host_timezone }}"    指定时区变量
      notify: restart crond    指定触发运行的任务程序crond
  handlers:       触发运行的程序 
    - name: restart crond        重启服务
      service:    指定服务
        name: crond   服务名称
        state: restarted  重新启动

知识点补充:crond服务
crond服务是一种守护进程,用来定期执行程序,安装完成系统之后,默认便会启动此任务调度命令。crond命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作,可以通过crontab 命令添加或者编辑需要定时执行的任务。
在这里插入图片描述

11.受管主机查看结果

[root@serverb ~]# timedatectl 
               Local time: Tue 2020-04-14 07:50:28 BST
           Universal time: Tue 2020-04-14 06:50:28 UTC
                 RTC time: Tue 2020-04-14 14:50:27
                Time zone: Europe/London (BST, +0100)
System clock synchronized: no
              NTP service: active
          RTC in local TZ: no
[root@servera ~]# timedatectl 
               Local time: Tue 2020-04-14 14:51:38 CST
           Universal time: Tue 2020-04-14 06:51:38 UTC
                 RTC time: Tue 2020-04-14 14:51:37
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
              NTP service: active
          RTC in local TZ: no

三.手动创建角色
角色创建流程:
分三个步骤
1.创建角色目录结构
2.定义角色内容
3.在playbook中使用角色

[root@workstation roles]# ansible-galaxy init my_role  初始化
- my_role was created successfully
[root@workstation roles]# tree my_role/   
my_role/  具体角色项目名称,比如nginx/tomcat/php(资自由设置)
├── defaults   用于设置当前角色的默认变量,此目录包含一个main.yml
│   └── main.yml  此文件类似代码中的主函数,进行统一管理
├── files      用来存放copy模块或script模块调用的文件
├── handlers  定义此角色中触发条件是执行的动作,此目录也包含一个main.yml文件
│   └── main.yml
├── meta   用于定义此角色的特殊设定关系极其依赖关系,此目录也包含一盒main.yml文件
│   └── main.yml
├── README.md  说明文件
├── tasks  定义当前角色的任务列表,此目录包含一个main.yml文件
│   └── main.yml
├── templates  用来存放jinja2模板。template模块会自动在此目录中寻找jiaja2模板文件
├── tests  存放测试role本身功能的playbook和主机定义文件在开发测试阶段常用,此目录包含以下两个文件
│   ├── inventory
│   └── test.yml
└── vars  定义角色用到的变量,此目录包含一个main.yml文件
    └── main.yml

8 directories, 8 files

练习
1.创建并初始化

[root@workstation ~]# mkdir roles_create  创建目录
[root@workstation ~]# cd roles_create/
[root@workstation roles_create]# mkdir roles
[root@workstation roles_create]# cd roles
[root@workstation roles]# ansible-galaxy init myvhost  初始化
- myvhost was created successfully
[root@workstation roles]# ls  目录自动生成
myvhost
[root@workstation roles]# cd myvhost/
[root@workstation myvhost]# ls   文件自动生成
defaults  files  handlers  meta  README.md  tasks  templates  tests  vars

2.配置tasks(任务)的play
任务:安装启动服务和配置虚拟主机

[root@workstation myvhost]# cd tasks/
[root@workstation tasks]# vim main.yml
---
# tasks file for myvhost
- name: Install httpd   安装Apache
  yum: 
    name: httpd
    state: latset   
- name: start and enabled httpd     启动和开机启动
  service:        服务
    name: httpd    
    state: started   
    enabled: true   
- name: Install vhost file        
  template:
    src: vhost.conf.j2
    dest: /etc/httpd/conf.d/vhost.conf
    owner: root
    group: root
    mode: 0644
  notify:
    - restart httpd

3.编写notify触发的处理程序

[root@workstation myvhost]# cd handlers/
[root@workstation handlers]# vim main.yml
[root@workstation handlers]# cat main.yml 
---
# handlers file for myvhost
- name: restart httpd    
  service:
    name: httpd
    state: restarted

4.编写html文件

[root@workstation myvhost]# mv files /root/roles_create/
[root@workstation myvhost]# ls
defaults  handlers  meta  README.md  tasks  templates  tests  vars
[root@workstation roles_create]# ls
files  
[root@workstation files]# mkdir html
[root@workstation files]# ls
html
[root@workstation files]# cd html/
[root@workstation html]# vim index.yml
www.westos.org

5.配置模板

[root@workstation myvhost]# cd templates/
[root@workstation templates]# vim vhost.conf.j2
[root@workstation templates]# cat vhost.conf.j2 
<VirtualHost *:80>
    DocumentRoot  /www
    ServerName  www.westos.org
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot  /bbs
    ServerName  bbs.westos.org
</VirtualHost>

6.编写roles的playbook

[root@workstation roles_create]# vim inventory 受管主机
[webservers]
servera.lab.example.com
serverb.lab.example.com
[root@workstation roles_create]# vim ansible.cfg  配置文件
[defaults]
inventory = ./inventory

[root@workstation roles_create]# vim user_vhost_role.yml   roles的主playbook
---
- name: use myvhost     使用角色的playbook
  hosts: webservers    指定主机组
  pre_tasks:     角色之前执行的任务
    - name: pre_tasks messages      
      debug:
        msg: "Ensure web server configuration"   确保网站服务器设定正确
  roles:           指定角色
    - myvhost
  post_tasks:  角色之后执行的任务
    - name: Configure html     设置默发布页面
      copy:                 文件上传模块
        src: files/html/     上传文件路径
        dest: /var/www/vhost/{{ ansible_hostname }}     上传到指定存放位置   
    - name: post_tasks messages    
      debug:     
        msg: "web server is configured"  网络服务器已配置

[root@workstation roles_create]# ansible-playbook  user_vhost_role.yml   运行play

在这里插入图片描述

1.[root@servera ~]# ls /etc/httpd/conf.d/  受管主机上已经存在vhost.conf文件
autoindex.conf  example.conf  README  ssl.conf  userdir.conf  vhost.conf  welcome.conf



2.[root@serverb www]# cd vhost/
[root@serverb vhost]# ls
serverb
[root@serverb vhost]# cd serverb/
[root@serverb serverb]# ls
index.hml
[root@serverb serverb]# cat index.hml 
www.westos.org

发布了46 篇原创文章 · 获赞 6 · 访问量 1340

猜你喜欢

转载自blog.csdn.net/qq_46089299/article/details/105493537