8.Ansible:Roles、Galaxy、Vault加密
[toc]
Ansible Roles基本概述
roles不管是Ansible还是saltstack,在写一键部署的时候,都不可能把所有的步骤全部写入到一个’剧本’文件当中,我们肯定需要把不同的工作模块,拆分开来(解耦),那么说到解耦,我们就需要用到roles官方推荐,因为roles的目录结构层次更加清晰。
例如:我们之前推荐大家写一个base.yml里面写所有基础优化的项目,其实把所有东西摞进去也是很鸡肋的,不如我们把这些功能全部拆分开,谁需要使用,就调用即可。
建议:每个roles最好只使用一个tasks这样方便我们去调用,能够很好的做到解耦。(SOA)
Ansible Roles目录结构
官方推荐最佳实践目录结构定义方式
1 | production # inventory file for production servers |
使用galaxy创建roles目录结构及运作流程
1 | # 在roles目录下创建目录结构 |
Ansible Roles依赖关系
roles允许你在使用roles时自动引入其他的roles。role依赖关系存储在roles目录中meta/main.yml文件中。
例如:推送wordpress并解压,前提条件,必须要安装nginx和php,把服务跑起来,才能运行wordpress的页面,此时我们就可以在wordpress的roles中定义依赖nginx和php的roles
1 | vim /etc/ansible/roles/wordpress/meta/main.yml |
如果编写了meta目录下的main.yml文件,那么Ansible会自动先执行meta目录中main.yml文件中的dependencies文件,如上所示,就会先执行nginx和php的安装。
Ansible Roles示例
roles小技巧
- 创建roles目录结构,手动使用ansible-galaxy init test
- 编写roles功能
- 在playbook中引用
使用roles重构rsync
规划目录结构如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24# 创建roles目录并进入
mkdir /etc/ansible/roles/ && cd /etc/ansible/roles/
# 创建rsync的roles层级目录
ansible-galaxy init rsync
# 查看层级目录
tree
.
└── rsync
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml定义roles主机清单
1
2
3
4# 创建主机清单文件并定义主机池
vim /etc/ansible/roles/hosts
[backup]
172.16.1.41指定backup主机组,执行那个roles
1
2
3
4
5# 创建主yml文件,并定义执行动作
vim /etc/ansible/roles/site.yml
- hosts: all
roles:
- {role: rsync,when: ansible_hostname == 'backup'}查看rsync角色的tasks任务
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# 1.安装rsync
vim /etc/ansible/roles/rsync/tasks/install.yml
- name: Install Rsync
yum:
name: rsync
# 2.配置rsync
vim /etc/ansible/roles/rsync/tasks/config.yml
- name: Push Rsync Conf
template:
src: rsyncd.conf.j2
dest: /etc/rsyncd.conf
notify: Restart Rsync Server
- name: Create Passwd File
copy:
content: "{{ rsync_user }}:{{ rsync_passwd }}"
dest: "{{ rsync_passwd_file }}"
mode: 0600
- name: Create {{ backup_dir }}
file:
path: /{{ backup_dir }}
state: directory
owner: "{{ name }}"
group: "{{ name }}"
# 3.启动rsync
vim /etc/ansible/roles/rsync/tasks/start.yml
- name: Start Rsync
service:
name: rsyncd
state: started
enabled: yes
# 4.将写完的tas文件包含到main.yml中
vim /etc/ansible/roles/rsync/tasks/main.yml
- include_tasks: install.yml
- include_tasks: config.yml
- include_tasks: start.yml查看rsync角色的handlers
1
2
3
4
5
6# 创建handlers触发的重启动作
vim /etc/ansible/roles/rsync/handlers/main.yml
- name: Restart Rsync Server
service:
name: rsyncd
state: restarted查看rsync角色的files目录
1
2
3
4# 在files放入配置文件
ll /etc/ansible/roles/rsync/files/
total 8
-rw-r--r-- 1 root root 322 Nov 16 18:49 rsyncd.conf查看rsync依赖
1
2
3
4
5
6
7
8
9# 创建rsync依赖文件并指向路径
vim /etc/ansible/roles/rsync/meta/main.yml
dependencies:
- {role: create_user}
## 此处省略编辑创建用户的playbook
1)初始化一个create_user目录
2)在tasks/main.yml中写入创建用户和组即可
3)建议使用变量执行roles
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 使用-t指定执行测试rsync角色执行roles(site.yml)
ansible-playbook -i hosts -t rsync site.yml
PLAY [backup] ********************************************************************************************
TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.41]
TASK [backup : Install Rsync Server] ***********************************************************************
ok: [172.16.1.41]
TASK [backup : Configure Rsync Server] *********************************************************************
ok: [172.16.1.41]
TASK [backup : Start Rsync Server] *************************************************************************
ok: [172.16.1.41]
PLAY RECAP ********************************************************************************************
172.16.1.41 : ok=5 changed=0 unreachable=0 failed=0
使用roles重构nfs
使用roles创建Nfs服务, 目录结构如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 目录结构
tree /etc/ansible/roles
├── group_vars
│ └── all
├── hosts
├── nfs
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── exports
│ └── vars
├── site.yml定义roles主机清单
1
2
3
4# 创建主机清单文件并定义主机池
vim /etc/ansible/roles/hosts
[nfs]
172.16.1.31指定nfs主机组,执行那个roles
1
2
3
4
5
6
7# 创建主yml文件,并定义执行动作
vim /etc/ansible/roles/site.yml
- hosts: nfs
remote_user: root
roles:
- nfs
tags: nfs查看nfs角色的tasks任务
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# 创建task任务文件
vim /etc/ansible/roles/nfs/tasks/main.yml
- name: Install Nfs-Server
yum:
name:nfs-utils
state: present
- name: Configure Nfs-Server
template:
src: exports
dest: /etc/exports
notify: Restart Nfs-Server
- name: Create Directory Data
file:
path: {{ share_dir }}
state: directory
owner: www
group: www
mode: 0755
- name: Start Nfs-Server
systemd:
name: nfs
state: started
enabled: yes查看nfs角色的handlers
1
2
3
4
5
6# 创建handlers触发任务
vim /etc/ansible/roles/nfs/handlers/main.yml
- name: Restart Nfs-Server
systemd:
name: nfs
state: restarted查看rsync角色的files目录
1
2
3# 创建nfs的变量配置文件并存入templates目录下
vim /etc/ansible/roles/nfs/templates/exports
{{ share_dir }} {{ share_ip }}(rw,sync,all_squash,anonuid=666,anongid=666)nfs对应的变量定义
1
2
3
4
5# 创建组变量
vim /etc/ansible/roles/group_vars/all
#nfs
share_dir: /data
share_ip: 172.16.1.31执行roles
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# 使用-t指定执行nfs标签执行roles(site.yml)
ansible-playbook -i hosts -t nfs site.yml
PLAY [nfs] ********************************************************************************************
TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.31]
TASK [nfs : Install Nfs-Server] ***********************************************************************
ok: [172.16.1.31]
TASK [nfs : Configure Nfs-Server] *********************************************************************
ok: [172.16.1.31]
TASK [nfs : Create Directory Data] ********************************************************************
ok: [172.16.1.31]
TASK [nfs : Start Nfs-Server] *************************************************************************
ok: [172.16.1.31]
PLAY RECAP ********************************************************************************************
172.16.1.31 : ok=5 changed=0 unreachable=0 failed=0
Ansible Galaxy
什么是Galaxy?
Galaxy是一个免费网站,类似于github网站,网站上基本都是共享roles,从Galaxy下载roles是最快启动项目方式之一。
Galaxy官方网站:TP
ansible提供了一个命令ansible-galaxy,可以用来对roles项目进行初始化,查找,安装,移除等操作
1 | # 语法结构 |
Ansible vault(playbook加密)
1 | # 语法结构 |