自动化运维工具Ansible之Roles角色详解
Ansible Roles 详解与实战案例
主机规划
添加用户账号
说明:
1、 运维人员使用的登录账号;
2、 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放;
3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 yun 用户也进行了 sudo 提权)。
1 # 使用一个专门的用户,避免直接使用root用户
2 # 添加用户、指定家目录并指定用户密码
3 # sudo提权
4 # 让其它普通用户可以进入该目录查看信息
5 useradd -u 1050 -d /app yun && echo '123456' | /usr/bin/passwd --stdin yun
6 echo "yun ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
7 chmod 755 /app/
Ansible 配置清单Inventory
之后文章都是如下主机配置清单
1 [yun@ansi-manager ansible_info]$ pwd
2 /app/ansible_info
3 [yun@ansi-manager ansible_info]$ cat hosts_key
4 # 方式1、主机 + 端口 + 密钥
5 [manageservers]
6 172.16.1.180:22
7
8 [proxyservers]
9 172.16.1.18[1:2]:22
10
11 # 方式2:别名 + 主机 + 端口 + 密码
12 [webservers]
13 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22
14 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22
15 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22
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 为目录名称
这样创建的目录是全目录,但是我们可能只需要部分目录,因此实际应用中大多数都由我们自己创建目录,而不是用命令创建目录。
示例目录构造如下:
1 [yun@ansi-manager tmp]$ tree ./
2 ./
3 ├── sit.yml
4 ├── webservers.yml
5 └── roles
6 └── nfs # 角色名称
7 ├── defaults # 角色默认变量(最低优先级)
8 │ └── main.yml
9 ├── files # 文件存放
10 ├── handlers # 触发任务
11 │ └── main.yml
12 ├── meta # 依赖关系
13 │ └── main.yml
14 ├── README.md # 使用说明
15 ├── tasks # 具体任务
16 │ └── main.yml
17 ├── templates # 模板文件
18 └── vars # 角色其他变量
19 └── main.yml
20
21 10 directories, 10 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。
1 [yun@ansi-manager playbook]$ cat /app/roles/wordpress/meta/main.yml
2 ---
3 dependencies:
4 - { role: nginx }
5 - { role: php-fpm }
此时 WordPress 的 role 会先执行 Nginx 的 role,然后执行 php-fpm 的 role,最后再执行 WordPress 本身的 role。
Ansible Roles 案例实战-部署 NFS 服务
整体目录结构
1 [yun@ansi-manager ansible_roles]$ pwd
2 /app/ansible_info/ansible_roles
3 [yun@ansi-manager ansible_roles]$ ll
4 total 4
5 drwxrwxr-x 2 yun yun 17 Sep 15 19:41 group_vars
6 -rw-rw-r-- 1 yun yun 108 Sep 15 19:37 nfs_server.yml
7 drwxrwxr-x 4 yun yun 35 Sep 15 18:00 roles
8 [yun@ansi-manager ansible_roles]$ tree # 目录结构
9 .
10 ├── group_vars
11 │ └── all
12 ├── nfs_server.yml
13 └── roles
14 ├── nfs # 服务端
15 │ ├── handlers
16 │ │ └── main.yml
17 │ ├── tasks
18 │ │ ├── config.yml
19 │ │ ├── install.yml
20 │ │ ├── main.yml
21 │ │ ├── mkdir.yml
22 │ │ ├── start_NFS.yml
23 │ │ └── start_rpcbind.yml
24 │ └── templates
25 │ └── exports.j2
26 └── nfs_client # 客户端
27 └── tasks
28 └── main.yml
29
30 9 directories, 11 files
服务端信息
目录结构
1 [yun@ansi-manager ansible_roles]$ pwd
2 /app/ansible_info/ansible_roles
3 [yun@ansi-manager ansible_roles]$ tree roles/nfs
4 roles/nfs
5 ├── handlers
6 │ └── main.yml
7 ├── tasks
8 │ ├── config.yml
9 │ ├── install.yml
10 │ ├── main.yml
11 │ ├── mkdir.yml
12 │ ├── start_NFS.yml
13 │ └── start_rpcbind.yml
14 └── templates
15 └── exports.j2
16
17 4 directories, 8 files
tasks任务目录信息
1 [yun@ansi-manager ansible_roles]$ cat roles/nfs/tasks/main.yml
2 - include_tasks: install.yml
3 - include_tasks: config.yml
4 - include_tasks: mkdir.yml
5 - include_tasks: start_rpcbind.yml
6 - include_tasks: start_NFS.yml
7
8 [yun@ansi-manager ansible_roles]$ cat roles/nfs/tasks/install.yml
9 - name: "install package NFS "
10 yum:
11 name:
12 - nfs-utils
13 - rpcbind
14 state: present
15
16 [yun@ansi-manager ansible_roles]$ cat roles/nfs/tasks/config.yml
17 - name: "NFS server config and edit restart"
18 template:
19 src: exports.j2
20 dest: /etc/exports
21 owner: root
22 group: root
23 mode: '644'
24 notify: "reload NFS server"
25
26 [yun@ansi-manager ansible_roles]$ cat roles/nfs/tasks/mkdir.yml
27 - name: "create NFS dir"
28 file:
29 path: /data
30 owner: yun
31 group: yun
32 state: directory
33 recurse: yes
34
35 [yun@ansi-manager ansible_roles]$ cat roles/nfs/tasks/start_rpcbind.yml
36 - name: "rpcbind server start"
37 systemd:
38 name: rpcbind
39 state: started
40 daemon_reload: yes
41 enabled: yes
42
43 [yun@ansi-manager ansible_roles]$ cat roles/nfs/tasks/start_NFS.yml
44 - name: "NFS server start"
45 systemd:
46 name: nfs
47 state: started
48 daemon_reload: yes
49 enabled: yes
handlers任务目录信息
1 [yun@ansi-manager ansible_roles]$ cat roles/nfs/handlers/main.yml
2 - name: "reload NFS server"
3 systemd:
4 name: nfs
5 state: reloaded
模板目录信息
1 [yun@ansi-manager ansible_roles]$ cat roles/nfs/templates/exports.j2
2 {{ nfs_dir }} 172.16.1.0/24(rw,sync,root_squash,all_squash,anonuid=1050,anongid=1050)
客户端信息
客户端就比较简单了,就一个挂载任务
1 [yun@ansi-manager ansible_roles]$ cat roles/nfs_client/tasks/main.yml
2 - name: "mount NFS server"
3 mount:
4 src: 172.16.1.180:{{ nfs_dir }}
5 path: /mnt
6 fstype: nfs
7 opts: defaults
8 state: mounted
变量信息
1 [yun@ansi-manager ansible_roles]$ pwd
2 /app/ansible_info/ansible_roles
3 [yun@ansi-manager ansible_roles]$ cat group_vars/all
4 # NFS 服务端目录
5 nfs_dir: /data
playbook 信息
1 [yun@ansi-manager ansible_roles]$ cat nfs_server.yml
2 ---
3 # NFS server
4 - hosts: manageservers
5 roles:
6 - nfs
7
8 - hosts: proxyservers
9 roles:
10 - nfs_client
任务执行
1 [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key --syntax-check nfs_server.yml # 语法检测
2 [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key -C nfs_server.yml # 预执行,测试执行
3 [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key nfs_server.yml # 执行
Ansible Roles 案例实战-部署 memcached 服务
整体目录结构
1 [yun@ansi-manager ansible_roles]$ pwd
2 /app/ansible_info/ansible_roles
3 [yun@ansi-manager ansible_roles]$ ll
4 total 8
5 -rw-rw-r-- 1 yun yun 71 Sep 16 09:05 memcached_server.yml
6 drwxrwxr-x 5 yun yun 52 Sep 16 08:38 roles
7 [yun@ansi-manager ansible_roles]$ tree roles/
8 roles/
9 └── memcached
10 ├── handlers
11 │ └── main.yml
12 ├── tasks
13 │ ├── config.yml
14 │ ├── install.yml
15 │ ├── main.yml
16 │ └── start.yml
17 └── templates
18 └── memcached.j2
19
20 11 directories, 15 files
服务信息
目录结构
1 [yun@ansi-manager memcached]$ pwd
2 /app/ansible_info/ansible_roles/roles/memcached
3 [yun@ansi-manager memcached]$ ll
4 total 0
5 drwxrwxr-x 2 yun yun 22 Sep 16 08:56 handlers
6 drwxrwxr-x 2 yun yun 76 Sep 16 08:53 tasks
7 drwxrwxr-x 2 yun yun 26 Sep 16 08:55 templates
8 [yun@ansi-manager memcached]$ tree
9 .
10 ├── handlers
11 │ └── main.yml
12 ├── tasks
13 │ ├── config.yml
14 │ ├── install.yml
15 │ ├── main.yml
16 │ └── start.yml
17 └── templates
18 └── memcached.j2
19
20 3 directories, 6 files
tasks任务目录信息
1 [yun@ansi-manager memcached]$ cat tasks/main.yml
2 - include_tasks: install.yml
3 - include_tasks: config.yml
4 - include_tasks: start.yml
5
6 [yun@ansi-manager memcached]$ cat tasks/install.yml
7 - name: " install package memcached"
8 yum:
9 name: memcached
10 state: present
11
12 [yun@ansi-manager memcached]$ cat tasks/config.yml
13 - name: "memcached server config and edit restart"
14 template:
15 src: memcached.j2
16 dest: /etc/sysconfig/memcached
17 owner: root
18 group: root
19 mode: '644'
20 notify: "restart memcached server"
21
22 [yun@ansi-manager memcached]$ cat tasks/start.yml
23 - name: "memcached server start"
24 systemd:
25 name: memcached
26 state: started
27 daemon_reload: yes
28 enabled: yes
handlers任务目录信息
1 [yun@ansi-manager memcached]$ cat handlers/main.yml
2 - name: "restart memcached server"
3 systemd:
4 name: memcached
5 state: restarted
模板目录信息
1 [yun@ansi-manager memcached]$ cat templates/memcached.j2
2 PORT="11211"
3 USER="memcached"
4 MAXCONN="1024"
5 CACHESIZE="{{ ansible_memtotal_mb // 2 }}"
6 OPTIONS=""
playbook 信息
1 [yun@ansi-manager ansible_roles]$ cat memcached_server.yml
2 ---
3 # memcached server
4 - hosts: manageservers
5 roles:
6 - memcached
任务执行
1 [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key --syntax-check memcached_server.yml # 语法检测
2 [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key -C memcached_server.yml # 预执行,测试执行
3 [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key memcached_server.yml # 执行
Ansible Roles 案例实战-部署 Rsync 服务
整体目录结构
1 [yun@ansi-manager ansible_roles]$ pwd
2 /app/ansible_info/ansible_roles
3 [yun@ansi-manager ansible_roles]$ ll
4 total 12
5 drwxrwxr-x 2 yun yun 17 Sep 29 09:33 group_vars
6 drwxrwxr-x 7 yun yun 86 Sep 29 08:49 roles
7 -rw-rw-r-- 1 yun yun 116 Sep 29 09:50 rsyncd_server.yml
8 [yun@ansi-manager ansible_roles]$ tree roles/
9 roles/
10 ├── rsync_client
11 │ ├── tasks
12 │ │ └── main.yml
13 │ └── templates
14 │ └── rsync.password.j2
15 └── rsyncd
16 ├── handlers
17 │ └── main.yml
18 ├── tasks
19 │ ├── config.yml
20 │ ├── install.yml
21 │ ├── main.yml
22 │ ├── mkdir.yml
23 │ └── start_rsyncd.yml
24 └── templates
25 ├── rsyncd.conf.j2
26 └── rsync.password.j2
27
28 18 directories, 25 files
服务端信息
目录结构
1 [yun@ansi-manager rsyncd]$ pwd
2 /app/ansible_info/ansible_roles/roles/rsyncd
3 [yun@ansi-manager rsyncd]$ tree
4 .
5 ├── handlers
6 │ └── main.yml
7 ├── tasks
8 │ ├── config.yml
9 │ ├── install.yml
10 │ ├── main.yml
11 │ ├── mkdir.yml
12 │ └── start_rsyncd.yml
13 └── templates
14 ├── rsyncd.conf.j2
15 └── rsync.password.j2
16
17 3 directories, 8 files
tasks任务目录信息
1 [yun@ansi-manager rsyncd]$ pwd
2 /app/ansible_info/ansible_roles/roles/rsyncd
3 [yun@ansi-manager rsyncd]$ cat tasks/main.yml
4 - include_tasks: install.yml
5 - include_tasks: config.yml
6 - include_tasks: mkdir.yml
7 - include_tasks: start_rsyncd.yml
8
9 [yun@ansi-manager rsyncd]$ cat tasks/install.yml
10 - name: "Install package rsync"
11 yum:
12 name: rsync
13 state: present
14
15 [yun@ansi-manager rsyncd]$ cat tasks/config.yml
16 - name: "rsyncd server config and edit restart"
17 template:
18 src: rsyncd.conf.j2
19 dest: /etc/rsyncd.conf
20 owner: root
21 group: root
22 mode: '644'
23 notify: "restart rsyncd server"
24
25 - name: "rsyncd server password file"
26 template:
27 src: rsync.password.j2
28 dest: /etc/rsync.password
29 owner: root
30 group: root
31 mode: '400'
32
33 [yun@ansi-manager rsyncd]$ cat tasks/mkdir.yml
34 - name: "create rsync business backup dir"
35 file:
36 path: /backup/busi_data
37 owner: root
38 group: root
39 state: directory
40 recurse: yes
41
42 - name: "create rsync database backup dir"
43 file:
44 path: /backup/database
45 owner: root
46 group: root
47 state: directory
48 recurse: yes
49
50 [yun@ansi-manager rsyncd]$ cat tasks/start_rsyncd.yml
51 - name: "rsyncd server start"
52 systemd:
53 name: rsyncd
54 state: started
55 daemon_reload: yes
56 enabled: yes
handlers任务目录信息
1 [yun@ansi-manager rsyncd]$ cat handlers/main.yml
2 - name: "restart rsyncd server"
3 systemd:
4 name: rsyncd
5 state: restarted
模板目录信息
1 [yun@ansi-manager rsyncd]$ pwd
2 /app/ansible_info/ansible_roles/roles/rsyncd
3 [yun@ansi-manager rsyncd]$ cat templates/rsyncd.conf.j2 # 文件1
4 # 备注:更多参数与更多详解,参见 man rsyncd.conf
5 #rsync_config---------------start
6 uid = root
7 gid = root
8 use chroot = false
9 max connections = 200
10 timeout = 100
11 pid file = /var/run/rsyncd.pid
12 lock file = /var/run/rsync.lock
13 log file = /var/log/rsyncd.log
14 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
15 ignore errors = true
16 read only = false
17 list = false
18
19 ## 注意为了避免困惑 hosts allow 和 hosts deny 请二选其一
20 hosts allow = 172.16.1.0/24,10.9.0.0/16,120.27.48.179
21 # hosts deny = 10.0.0.0/16
22 # 支持多个认证账号
23 auth users = {{ auth_user }}
24 secrets file = /etc/rsync.password
25
26
27 # 数据备份 注意 path 目录的权限信息
28 [back_data_module]
29 path = /backup/busi_data/
30
31 # 数据库备份 注意 path 目录的权限信息
32 [back_db_module]
33 path = /backup/database/
34
35 #rsync_config---------------end
36
37 [yun@ansi-manager rsyncd]$ cat templates/rsync.password.j2 # 文件2
38 {{ auth_user }}:{{ auth_pawd }}
客户端信息
1 [yun@ansi-manager rsync_client]$ pwd
2 /app/ansible_info/ansible_roles/roles/rsync_client
3 [yun@ansi-manager rsync_client]$ tree # 目录结构
4 .
5 ├── tasks
6 │ └── main.yml
7 └── templates
8 └── rsync.password.j2
9
10 2 directories, 2 files
11 [yun@ansi-manager rsync_client]$ cat tasks/main.yml # tasks 信息
12 - name: "rsync passwrod file config"
13 template:
14 src: rsync.password.j2
15 dest: /etc/rsync.password
16 owner: root
17 group: root
18 mode: '400'
19
20 [yun@ansi-manager rsync_client]$ cat templates/rsync.password.j2 # 模板信息
21 {{ auth_pawd }}
变量信息
1 [yun@ansi-manager ansible_roles]$ pwd
2 /app/ansible_info/ansible_roles
3 [yun@ansi-manager ansible_roles]$ cat group_vars/all
4 # NFS 服务端目录
5 nfs_dir: /data
6 # rsync daemon 使用
7 auth_user: rsync_backup
8 auth_pawd: rsync_backup_pwd
playbook 信息
1 [yun@ansi-manager ansible_roles]$ cat rsyncd_server.yml
2 ---
3 # rsyncd server
4 - hosts: manageservers
5 roles:
6 - rsyncd
7
8 - hosts: proxyservers
9 roles:
10 - rsync_client
任务执行
1 [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key --syntax-check rsyncd_server.yml # 语法检测
2 [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key -C rsyncd_server.yml # 预执行,测试执行
3 [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key rsyncd_server.yml # 执行
Ansible Galaxy
https://galaxy.ansible.com
———END——— 如果觉得不错就关注下呗 (-^O^-) !
- 如何通过iframe调用其他页面的内容
- WCF 学习总结1 -- 简单实例
- Java8 + Tomcat8 实现Websocket 例子
- Python Syslog Server 开发实例
- WCF 学习总结2 -- 配置WCF
- SQLite事务 SQLite插入多条语句为什么这么慢?.net (C#)
- Linux 应用程序开发入门
- LINQ to XML LINQ学习第一篇
- PHP 安全与性能
- Extjs 项目中常用的小技巧,也许你用得着(5)--设置 Ext.data.Store 传参的请求方式
- WPF备忘录(5)怎样修改模板中的控件
- Linux 系统与数据库安全
- 使用委托实现同步回调与异步回调
- Application Firewall Design
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CICD(三)Ansible常用模块以及案例
- 深入SVM:支持向量机核的作用是什么
- kubernetes(三)之Docker网络详解
- kubernetes(二)之Docker容器及镜像
- 反向传播算法:定义,概念,可视化
- Go语言(二十一) 常见的模块使用
- kubernetes(一)之Docker基础入门
- Go语言(二十)日志采集项目(二)Etcd的使用
- prometheus入门(一)
- Go语言(十九)日志采集项目之logagent开发(一)
- Go语言(十 八)context&日志项目
- 使用梯度上升欺骗神经网络,让网络进行错误的分类
- Go语言(十七) 配置文件库项目
- Python 相对路径问题:“No such file or directory“
- 基于etcd服务发现的overlay跨多宿主机容器网络