Ansible Roles 详解与实战案例

主机规划

添加用户账号

说明:

1、 运维人员使用的登录账号;

2、 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放;

3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 yun 用户也进行了 sudo 提权)。

 # 使用一个专门的用户,避免直接使用root用户
# 添加用户、指定家目录并指定用户密码
# sudo提权
# 让其它普通用户可以进入该目录查看信息
useradd -u -d /app yun && echo '' | /usr/bin/passwd --stdin yun
echo "yun ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
chmod /app/

Ansible 配置清单Inventory

之后文章都是如下主机配置清单

 [yun@ansi-manager ansible_info]$ pwd
/app/ansible_info
[yun@ansi-manager ansible_info]$ cat hosts_key
# 方式1、主机 + 端口 + 密钥
[manageservers]
172.16.1.180: [proxyservers]
172.16.1.18[:]: # 方式2:别名 + 主机 + 端口 + 密码
[webservers]
web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=
web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=
web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=

Ansible Roles 基本概述

前面已经学习了 变量、tasks 和 handlers,那怎样组织 playbook 才是最好的方式呢?

简单的回答就是:使用 roles。roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。以便 playbook 更好的调用。相比 playbook,roles 的结构更加的清晰有层次。

假如:无论我们安装什么软件都会安装时间同步服务,那么每个 playbook 都要编写时间同步服务的 task。此时我们可以将时间同步服务 task 写好,等到用的时候再调用即可。

注意事项:在编写 roles 的时候,最好能够将一个 task 拆分为一个文件,方便后续复用「彻底打散」。

Roles 目录结构

在 roles 目录下,可以使用如下命令创建目录

ansible-galaxy init nfs roles   # 其中 nfs 为目录名称

这样创建的目录是全目录,但是我们可能只需要部分目录,因此实际应用中大多数都由我们自己创建目录,而不是用命令创建目录。

示例目录构造如下:

 [yun@ansi-manager tmp]$ tree ./
./
├── sit.yml
├── webservers.yml
└── roles
└── nfs # 角色名称
├── defaults # 角色默认变量(最低优先级)
│ └── main.yml
├── files # 文件存放
├── handlers # 触发任务
│ └── main.yml
├── meta # 依赖关系
│ └── main.yml
├── README.md # 使用说明
├── tasks # 具体任务
│ └── main.yml
├── templates # 模板文件
└── vars # 角色其他变量
└── main.yml directories, files

目录说明:

1、首先要有 roles 目录,然后在 roles 目录下创建相应的目录。

2、roles 下的目录名最好见文知意,如 common 目录表示基础目录,是必要的;nfs 目录表示安装 nfs 服务;memcached 目录表示安装 memcached 服务;等等。

3、可以根据自身需要创建 roles 下的二级目录,不需要的目录可以不创建,没需要全目录创建。

4、roles 目录下的二级目录中,有些目录必须包含一个 main.yml 文件,以便 ansible 使用。

Roles 依赖关系

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

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

 [yun@ansi-manager playbook]$ cat /app/roles/wordpress/meta/main.yml
---
dependencies:
- { role: nginx }
- { role: php-fpm }

此时 WordPress 的 role 会先执行 Nginx 的 role,然后执行 php-fpm 的 role,最后再执行 WordPress 本身的 role。

Ansible Roles 案例实战-部署 NFS 服务

整体目录结构

 [yun@ansi-manager ansible_roles]$ pwd
/app/ansible_info/ansible_roles
[yun@ansi-manager ansible_roles]$ ll
total
drwxrwxr-x yun yun Sep : group_vars
-rw-rw-r-- yun yun Sep : nfs_server.yml
drwxrwxr-x yun yun Sep : roles
[yun@ansi-manager ansible_roles]$ tree # 目录结构
.
├── group_vars
│ └── all
├── nfs_server.yml
└── roles
├── nfs # 服务端
│ ├── handlers
│ │ └── main.yml
│ ├── tasks
│ │ ├── config.yml
│ │ ├── install.yml
│ │ ├── main.yml
│ │ ├── mkdir.yml
│ │ ├── start_NFS.yml
│ │ └── start_rpcbind.yml
│ └── templates
│ └── exports.j2
└── nfs_client # 客户端
└── tasks
└── main.yml directories, files

服务端信息

目录结构

 [yun@ansi-manager ansible_roles]$ pwd
/app/ansible_info/ansible_roles
[yun@ansi-manager ansible_roles]$ tree roles/nfs
roles/nfs
├── handlers
│ └── main.yml
├── tasks
│ ├── config.yml
│ ├── install.yml
│ ├── main.yml
│ ├── mkdir.yml
│ ├── start_NFS.yml
│ └── start_rpcbind.yml
└── templates
└── exports.j2 directories, files

tasks任务目录信息

 [yun@ansi-manager ansible_roles]$ cat roles/nfs/tasks/main.yml
- include_tasks: install.yml
- include_tasks: config.yml
- include_tasks: mkdir.yml
- include_tasks: start_rpcbind.yml
- include_tasks: start_NFS.yml [yun@ansi-manager ansible_roles]$ cat roles/nfs/tasks/install.yml
- name: "install package NFS "
yum:
name:
- nfs-utils
- rpcbind
state: present [yun@ansi-manager ansible_roles]$ cat roles/nfs/tasks/config.yml
- name: "NFS server config and edit restart"
template:
src: exports.j2
dest: /etc/exports
owner: root
group: root
mode: ''
notify: "reload NFS server" [yun@ansi-manager ansible_roles]$ cat roles/nfs/tasks/mkdir.yml
- name: "create NFS dir"
file:
path: /data
owner: yun
group: yun
state: directory
recurse: yes [yun@ansi-manager ansible_roles]$ cat roles/nfs/tasks/start_rpcbind.yml
- name: "rpcbind server start"
systemd:
name: rpcbind
state: started
daemon_reload: yes
enabled: yes [yun@ansi-manager ansible_roles]$ cat roles/nfs/tasks/start_NFS.yml
- name: "NFS server start"
systemd:
name: nfs
state: started
daemon_reload: yes
enabled: yes

handlers任务目录信息

 [yun@ansi-manager ansible_roles]$ cat roles/nfs/handlers/main.yml
- name: "reload NFS server"
systemd:
name: nfs
state: reloaded

模板目录信息

 [yun@ansi-manager ansible_roles]$ cat roles/nfs/templates/exports.j2
{{ nfs_dir }} 172.16.1.0/(rw,sync,root_squash,all_squash,anonuid=,anongid=)

客户端信息

客户端就比较简单了,就一个挂载任务

 [yun@ansi-manager ansible_roles]$ cat roles/nfs_client/tasks/main.yml
- name: "mount NFS server"
mount:
src: 172.16.1.180:{{ nfs_dir }}
path: /mnt
fstype: nfs
opts: defaults
state: mounted

变量信息

 [yun@ansi-manager ansible_roles]$ pwd
/app/ansible_info/ansible_roles
[yun@ansi-manager ansible_roles]$ cat group_vars/all
# NFS 服务端目录
nfs_dir: /data

playbook 信息

 [yun@ansi-manager ansible_roles]$ cat nfs_server.yml
---
# NFS server
- hosts: manageservers
roles:
- nfs - hosts: proxyservers
roles:
- nfs_client

任务执行

 [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key --syntax-check nfs_server.yml  # 语法检测
[yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key -C nfs_server.yml # 预执行,测试执行
[yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key nfs_server.yml # 执行

Ansible Roles 案例实战-部署 memcached 服务

整体目录结构

 [yun@ansi-manager ansible_roles]$ pwd
/app/ansible_info/ansible_roles
[yun@ansi-manager ansible_roles]$ ll
total
-rw-rw-r-- yun yun Sep : memcached_server.yml
drwxrwxr-x yun yun Sep : roles
[yun@ansi-manager ansible_roles]$ tree roles/
roles/
└── memcached
├── handlers
│ └── main.yml
├── tasks
│ ├── config.yml
│ ├── install.yml
│ ├── main.yml
│ └── start.yml
└── templates
└── memcached.j2 directories, files

服务信息

目录结构

 [yun@ansi-manager memcached]$ pwd
/app/ansible_info/ansible_roles/roles/memcached
[yun@ansi-manager memcached]$ ll
total
drwxrwxr-x yun yun Sep : handlers
drwxrwxr-x yun yun Sep : tasks
drwxrwxr-x yun yun Sep : templates
[yun@ansi-manager memcached]$ tree
.
├── handlers
│ └── main.yml
├── tasks
│ ├── config.yml
│ ├── install.yml
│ ├── main.yml
│ └── start.yml
└── templates
└── memcached.j2 directories, files

tasks任务目录信息

 [yun@ansi-manager memcached]$ cat tasks/main.yml
- include_tasks: install.yml
- include_tasks: config.yml
- include_tasks: start.yml [yun@ansi-manager memcached]$ cat tasks/install.yml
- name: " install package memcached"
yum:
name: memcached
state: present [yun@ansi-manager memcached]$ cat tasks/config.yml
- name: "memcached server config and edit restart"
template:
src: memcached.j2
dest: /etc/sysconfig/memcached
owner: root
group: root
mode: ''
notify: "restart memcached server" [yun@ansi-manager memcached]$ cat tasks/start.yml
- name: "memcached server start"
systemd:
name: memcached
state: started
daemon_reload: yes
enabled: yes

handlers任务目录信息

 [yun@ansi-manager memcached]$ cat handlers/main.yml
- name: "restart memcached server"
systemd:
name: memcached
state: restarted

模板目录信息

 [yun@ansi-manager memcached]$ cat templates/memcached.j2
PORT=""
USER="memcached"
MAXCONN=""
CACHESIZE="{{ ansible_memtotal_mb // 2 }}"
OPTIONS=""

playbook 信息

 [yun@ansi-manager ansible_roles]$ cat memcached_server.yml
---
# memcached server
- hosts: manageservers
roles:
- memcached

任务执行

 [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key --syntax-check memcached_server.yml  # 语法检测
[yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key -C memcached_server.yml # 预执行,测试执行
[yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key memcached_server.yml # 执行

Ansible Roles 案例实战-部署 Rsync 服务

整体目录结构

 [yun@ansi-manager ansible_roles]$ pwd
/app/ansible_info/ansible_roles
[yun@ansi-manager ansible_roles]$ ll
total
drwxrwxr-x yun yun Sep : group_vars
drwxrwxr-x yun yun Sep : roles
-rw-rw-r-- yun yun Sep : rsyncd_server.yml
[yun@ansi-manager ansible_roles]$ tree roles/
roles/
├── rsync_client
│ ├── tasks
│ │ └── main.yml
│ └── templates
│ └── rsync.password.j2
└── rsyncd
├── handlers
│ └── main.yml
├── tasks
│ ├── config.yml
│ ├── install.yml
│ ├── main.yml
│ ├── mkdir.yml
│ └── start_rsyncd.yml
└── templates
├── rsyncd.conf.j2
└── rsync.password.j2 directories, files

服务端信息

目录结构

 [yun@ansi-manager rsyncd]$ pwd
/app/ansible_info/ansible_roles/roles/rsyncd
[yun@ansi-manager rsyncd]$ tree
.
├── handlers
│ └── main.yml
├── tasks
│ ├── config.yml
│ ├── install.yml
│ ├── main.yml
│ ├── mkdir.yml
│ └── start_rsyncd.yml
└── templates
├── rsyncd.conf.j2
└── rsync.password.j2 directories, files

tasks任务目录信息

 [yun@ansi-manager rsyncd]$ pwd
/app/ansible_info/ansible_roles/roles/rsyncd
[yun@ansi-manager rsyncd]$ cat tasks/main.yml
- include_tasks: install.yml
- include_tasks: config.yml
- include_tasks: mkdir.yml
- include_tasks: start_rsyncd.yml [yun@ansi-manager rsyncd]$ cat tasks/install.yml
- name: "Install package rsync"
yum:
name: rsync
state: present [yun@ansi-manager rsyncd]$ cat tasks/config.yml
- name: "rsyncd server config and edit restart"
template:
src: rsyncd.conf.j2
dest: /etc/rsyncd.conf
owner: root
group: root
mode: ''
notify: "restart rsyncd server" - name: "rsyncd server password file"
template:
src: rsync.password.j2
dest: /etc/rsync.password
owner: root
group: root
mode: '' [yun@ansi-manager rsyncd]$ cat tasks/mkdir.yml
- name: "create rsync business backup dir"
file:
path: /backup/busi_data
owner: root
group: root
state: directory
recurse: yes - name: "create rsync database backup dir"
file:
path: /backup/database
owner: root
group: root
state: directory
recurse: yes [yun@ansi-manager rsyncd]$ cat tasks/start_rsyncd.yml
- name: "rsyncd server start"
systemd:
name: rsyncd
state: started
daemon_reload: yes
enabled: yes

handlers任务目录信息

 [yun@ansi-manager rsyncd]$ cat handlers/main.yml
- name: "restart rsyncd server"
systemd:
name: rsyncd
state: restarted

模板目录信息

 [yun@ansi-manager rsyncd]$ pwd
/app/ansible_info/ansible_roles/roles/rsyncd
[yun@ansi-manager rsyncd]$ cat templates/rsyncd.conf.j2 # 文件1
# 备注:更多参数与更多详解,参见 man rsyncd.conf
#rsync_config---------------start
uid = root
gid = root
use chroot = false
max connections =
timeout =
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
ignore errors = true
read only = false
list = false ## 注意为了避免困惑 hosts allow 和 hosts deny 请二选其一
hosts allow = 172.16.1.0/,10.9.0.0/,120.27.48.179
# hosts deny = 10.0.0.0/
# 支持多个认证账号
auth users = {{ auth_user }}
secrets file = /etc/rsync.password # 数据备份 注意 path 目录的权限信息
[back_data_module]
path = /backup/busi_data/ # 数据库备份 注意 path 目录的权限信息
[back_db_module]
path = /backup/database/ #rsync_config---------------end [yun@ansi-manager rsyncd]$ cat templates/rsync.password.j2 # 文件2
{{ auth_user }}:{{ auth_pawd }}

客户端信息

 [yun@ansi-manager rsync_client]$ pwd
/app/ansible_info/ansible_roles/roles/rsync_client
[yun@ansi-manager rsync_client]$ tree # 目录结构
.
├── tasks
│ └── main.yml
└── templates
└── rsync.password.j2 directories, files
[yun@ansi-manager rsync_client]$ cat tasks/main.yml # tasks 信息
- name: "rsync passwrod file config"
template:
src: rsync.password.j2
dest: /etc/rsync.password
owner: root
group: root
mode: '' [yun@ansi-manager rsync_client]$ cat templates/rsync.password.j2 # 模板信息
{{ auth_pawd }}

变量信息

 [yun@ansi-manager ansible_roles]$ pwd
/app/ansible_info/ansible_roles
[yun@ansi-manager ansible_roles]$ cat group_vars/all
# NFS 服务端目录
nfs_dir: /data
# rsync daemon 使用
auth_user: rsync_backup
auth_pawd: rsync_backup_pwd

playbook 信息

 [yun@ansi-manager ansible_roles]$ cat rsyncd_server.yml
---
# rsyncd server
- hosts: manageservers
roles:
- rsyncd - hosts: proxyservers
roles:
- rsync_client

任务执行

 [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key --syntax-check rsyncd_server.yml  # 语法检测
[yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key -C rsyncd_server.yml # 预执行,测试执行
[yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key rsyncd_server.yml # 执行

Ansible Galaxy

https://galaxy.ansible.com

———END———
如果觉得不错就关注下呗 (-^O^-) !

自动化运维工具Ansible之Roles测验详解的更多相关文章

  1. 自动化运维工具Ansible之Tests测验详解

    Ansible Tests 详解与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. 该用 ...

  2. 自动化运维工具Ansible的部署步骤详解

    本文来源于http://sofar.blog.51cto.com/353572/1579894,主要是看到这样一篇好文章,想留下来供各位同僚一起分享. 一.基础介绍 ================= ...

  3. 在CentOS7.6上安装自动化运维工具Ansible以及playbook案例实操

    前言 Ansible是一款优秀的自动化IT运维工具,具有远程安装.远程部署应用.远程管理能力,支持Windows.Linux.Unix.macOS和大型机等多种操作系统. 下面就以CentOS 7.6 ...

  4. 自动化运维工具-Ansible之7-roles

    自动化运维工具-Ansible之7-roles 目录 自动化运维工具-Ansible之7-roles Ansible Roles基本概述 Ansible Roles目录结构 Ansible Roles ...

  5. 自动化运维工具-Ansible之1-基础

    自动化运维工具-Ansible之1-基础 目录 自动化运维工具-Ansible之1-基础 Ansible 基本概述 定义 特点 架构 工作原理 任务执行模式 命令执行过程 Ansible 安装 Ans ...

  6. 自动化运维工具Ansible详细部署 (转载)

    自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog. ...

  7. 自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客

    自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客 自动化运维工具Ansible详细部署

  8. CentOS7Linux中自动化运维工具Ansible的安装,以及通过模块批量管理多台主机

    使用自动化运维工具Ansible集中化管理服务器 Ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet ...

  9. 自动化运维工具Ansible介绍

    一个由 Python 编写的强大的配置管理解决方案.尽管市面上已经有很多可供选择的配置管理解决方案,但他们各有优劣,而 ansible 的特点就在于它的简洁. 让 ansible 在主流的配置管理系统 ...

随机推荐

  1. view事件分发源码理解

    有些困难无法逃避,没办法,那就只有去解决它.view事件分发对我而言是一块很难啃的骨头,看了<安卓开发艺术探索>关于这个知识点的讲解,看了好几遍,始终不懂,最终通过调试分析结果,看博客,再 ...

  2. 记录:如何使用ASP.NET Core和EnityFramework Core实现服务和数据分离

    前情提要: 现有一个网站框架,包括主体项目WebApp一个,包含 IIdentityUser 接口的基架项目 A.用于处理用户身份验证的服务 AuthenticationService 位于命名空间B ...

  3. Salesforce 学习 | 官方总结最实用的Spring '20新功能

    在Spring '20正式发布之前,Trailblazers 社区举行了一个名为Treasure Hunt的在线活动,通过预览沙盒,分享他们认为Spring ‘20中最重要的功能.这篇文章就来盘点一下 ...

  4. 今天整理了几个在使用python进行数据分析的常用小技巧、命令。

    提高Python数据分析速度的八个小技巧 01 使用Pandas Profiling预览数据 这个神器我们在之前的文章中就详细讲过,使用Pandas Profiling可以在进行数据分析之前对数据进行 ...

  5. L11注意力机制和Seq2seq模型

    注意力机制 在"编码器-解码器(seq2seq)"⼀节⾥,解码器在各个时间步依赖相同的背景变量(context vector)来获取输⼊序列信息.当编码器为循环神经⽹络时,背景变量 ...

  6. stand up meeting 1/11/2016

    part 组员                工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云 跑通打印机功能,尝试与pdf读取部分结合;生词本卡片选择简略释义 ...

  7. jmeter引入外部jar包的方法

    jmeter最完美的jar包引入 第一步:需要新建一个文件夹用来存放需要引用的外部jar包,例如:建一个dependencies 文件夹 第二步:jmeter 的配置文件 jmeter.propert ...

  8. jmeter插件 --PerfMon Metrics Collector监控工具的使用

    PerfMon Metrics Collector 用来监控 被压测服务器的cpu.内存.磁盘.网络等 1.服务端监控程序ServerAgent下载 https://github.com/undera ...

  9. 使用sqlmap结合dnslog快速注入

    0x01 起因 实际项目中遇到一个oracle延时注入,需要获取数据,几十个库几百张表,等找到关键数据不知道要到哪天. 测试支持带外请求 于是想用使用sqlmap利用DNS进行OOB注入 0x02 阿 ...

  10. 基于centos7搭建kvm

    其他的和安装一般的系统没有差别 安装完成后. 1]使用ping www.baidu.com 2]修改静态ip,也可以不修改 3]下载brctlyum -y install bridge-utils 4 ...