1.Ansible roles概述

Ansible的角色(roles)是一种组织和复用Ansible任务和变量的机制。角色允许将相关的任务、变量和文件组织在一起,以便在多个Playbook中重复使用。

角色是Ansible的一种抽象层级,它将Playbook中的任务、变量和文件组织成更高级别的概念。通过使用角色,可以将复杂的任务和配置逻辑分解为更小、更可管理的部分,并使代码更加模块化和可重用

一个角色通常包含以下目录结构:

roles/
    myrole/
        tasks/
            main.yml
        handlers/
            main.yml
        templates/
            template.j2
        files/
            myfile.txt
        vars/
            main.yml
        defaults/
            main.yml
        meta/
            main.yml

tasks/目录:包含角色执行的任务文件,通常是main.yml。这些任务定义了角色的主要功能。

handlers/目录:包含角色的处理程序文件,通常是main.yml。处理程序是在特定事件触发时执行的任务,例如服务重启或配置文件重载。

templates/目录:包含角色使用的Jinja2模板文件。这些模板可以根据变量的值生成配置文件等。

files/目录:包含角色使用的普通文件,例如脚本或配置文件。

vars/目录:包含角色使用的变量文件,通常是main.yml。这些变量可以在任务和模板中使用。

defaults/目录:包含角色的默认变量文件,通常是main.yml。这些变量的默认值会被其他变量覆盖。

meta/目录:包含角色的元数据文件,通常是main.yml。元数据文件可以包含角色的依赖关系和其他相关信息。

使用角色的步骤如下:

在Ansible项目的roles/目录下创建一个新的目录,例如myrole/。

在myrole/目录下创建相关的子目录和文件,按照上述目录结构组织角色的任务、变量和文件。

在Playbook中使用角色:在Playbook中使用roles关键字指定要使用的角色。例如:

- name: My Playbook
  hosts: myhosts
  roles:
    - myrole

这将使用名为myrole的角色来执行任务。

角色的优点包括:

重用性:角色可以在多个Playbook中重复使用,提高了代码的可维护性和可重用性。

组织性:角色提供了一种组织任务、变量和文件的结构化方式,使代码更易于理解和维护。

可扩展性:角色可以包含其他角色作为依赖项,使得构建复杂的配置和部署流程变得更加灵活和可扩展。

总之,Ansible的角色是一种组织和复用Ansible任务和变量的机制。通过创建角色并在Playbook中使用它们,可以提高Ansible代码的可维护性和可重用性。

2.Ansible Roles依赖关系

roles允许您在使用role时自动引入其他 role。role依赖关系存储在role目录中meta/main.yml文件中。

例如:安装wordpress需要先确保nginx与PHP都能正常运行,此时可以在 wordpress的role中定义,依赖Nginx与PHP-fpm的roles。

[root@devops ~]# cat /root/roles/wordpress/meta/main.yml
dependencies:
– { role: nginx }
– { role: [php-fpm }
此时 wordpress 的role 会先执行 nginx的role、然后执行php-fpm的role,最后执行wordpress本身的role。

3.使用roles

创建目录

[root@ansible /server/playbook]$ mkdir basic/{tasks,templates,handlers,files} -p
[root@ansible /server/playbook]$ tree basic/
basic/
├── files
├── handlers
├── tasks
└── templates

调用角色

[root@ansible /server/playbook]$ cat top.yml
---
- hosts: all
  roles:
  - role: basic

剧本

[root@ansible /server/playbook]$ cat  basic/tasks/main.yml
- name: Base repo 
  yum_repository:
    name: Base
    description: Base
    baseurl: http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
    gpgcheck: yes
    gpgkey: http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
- name: epel repo
  yum_repository:
    name: epel
    description: epel
    baseurl: http://mirrors.aliyun.com/epel/7/$basearch
    gpgcheck: no
- name: released updates
  yum_repository:
    name: updates
    description: updates
    baseurl: http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
    gpgcheck: yes
    gpgkey: http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
- name: extras repository
  yum_repository:
    name: extras
    description: extras
    baseurl: http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
    gpgcheck: yes
    gpgkey: http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
- name:  nginx Repo
  yum_repository:
    name: nginx
    description: nginx repo
    baseurl: http://nginx.org/packages/centos/$releasever/$basearch/
    enabled: yes
    gpgcheck: yes
    gpgkey: https://nginx.org/keys/nginx_signing.key
  when: ( ansible_hostname is match("web|lb") )

- name: php repo
  yum_repository:
    name: php
    description: php
    baseurl: http://us-east.repo.webtatic.com/yum/el7/x86_64/
    enabled: yes
    gpgcheck: yes
  when: ( ansible_hostname is match("web") )

- name: Install Software
  yum:
    name: 
    - tree
    - vim
    - lrzsz
    - iotop
    - htop
    - nc
    - unzip
    - nmap
    - telnet
    - wget
    - zip
    - psmisc
    - ntpdate
    state: present

- name: Stop firewalld
  systemd:
    name: firewalld
    state: stopped
    enabled: no

- name: disabled selinux
  selinux:
    state: disabled

- name: groupadd
  group:
    name: dmxsp
    gid: 789
- name: useradd
  user:
    name: dmxsp
    uid: 789
    group: dmxsp
    shell: /sbin/nologin
    create_home: no

- name: configure crond time
  cron: 
    name: sync time
    minute: "*/2"
    job: "/sbin/ntpdate ntp1.aliyun.com &>>/dev/null"

- name: mkdir scripts dir
  file: 
    path: /server/scripts/
    state: directory

- name: push server backup scripts
  copy:
    src: files/backup-conf.sh
    dest: /server/scripts/

- name: configure crond backup
  cron:
    name: backup everyday
    minute: 00
    hour: 00
    job: "sh /server/scripts/backup-conf.sh &>>/dev/null"

执行

[root@ansible /server/playbook]$ ansible-playbook top.yml

目录

[root@ansible /server/playbook]$ tree basic/
basic/
├── files
│   └── backup-conf.sh
├── handlers
├── tasks
│   └── main.yml
└── templates

作者 dmxsp

发表回复

您的电子邮箱地址不会被公开。