ansible-role
一、为什么用role
把单个的大剧本,拆分为小剧本,便于维护,修改、使用
完成解耦、结构更清晰、调试更方便
如果是小部署, 还是剧本更方便,大型项目,必须通过role管理
在实际的工作当中,一个完整的项目实际上是很多功能体的组合,如果将所有的功能写在一个playbook中会存在如代码耦合程度高、playbook长而维护成本大、灵活性低等一系列的问题。
使用roles能巧妙的解决这一系列的问题。
roles是ansible1.2版本后加入的新功能,适合于大项目playbook的编排架构。
二、先明确,创建好role的规范目录
1.定义好role存放路径
grep '^role' /etc/ansible/ansible.cfg
roles_path = /etc/ansible/roles
2. 创建role的固定目录
site.yml # role入口
nfs_servers.yml # role
rsync_servers.yml # role
roles/ # role规范目录结构
nfs_servers/ # role具体名字
tasks/ # 剧本任务
handlers/ # 剧本里存放的handlers
files/ # 如压缩文件,如需要拷贝的文件
templates/ # 存放配置文件
vars/ # 存放变量文件
rsync_servers/
tasks/
handlers/
files/
templates/
vars/
3. 创建如上的目录结构
mkdir -p /etc/ansible/roles
# 这里定义的文件名,必须和roles目录下的每一个任务目录同名
touch /etc/ansible/{site.yml,nfs_servers.yml,rsync_servers.yml}
4. 创建关于rsync_servers的目录
mkdir -p /etc/ansible/roles/rsync_servers/{tasks,handlers,files,templates,vars}
5.检查创建好的目录结构
[root@master-61 /etc/ansible]#tree /etc/ansible/
/etc/ansible/
├── ansible.cfg
├── hosts
├── nfs_servers.yml
├── roles
│ └── rsync_servers
│ ├── files # 指的是目录中,存放剧本运行需要用到的文件
│ ├── handlers
│ ├── tasks
│ ├── templates
│ └── vars
├── rsync_servers.yml
└── site.yml
三、部署rsyncd服务的role角色
1.准备写装rsync服务的role
2.创建好对应的目录结构
3.写好playbook模式
4.拆开即可
1、写好playbook模式
- hosts: backup
vars:
rsync_id: '666'
rsync_name: 'www'
tasks:
# 1.创建www用户和组
- name: 01_create_group
group:
name: "{{ rsync_name }}"
gid: "{{ rsync_id }}"
# 2.创建www用户
- name: 02_create_user
user:
name: "{{ rsync_name }}"
gid: "{{ rsync_id }}"
group: "{{ rsync_name}}"
create_home: no
shell: /sbin/nologin
# 3.创建数据目录且授权
- name: 03_createUdata
file:
path: "{{ item }}"
state: direcotry
owner: "{{ rsync_name }}"
group: "{{ rsync_name}}"
mode: "755"
loop:
- /data
- /backup
# 4.安装rsync软件
- name: 04_install_rsync
yum:
name: rsync
state: latest
# 5.复制配置文件与密码文件
- name: 05_copy_config
copy:
src: "{{ item.src }}"
dest: /etc/
mode: "{{ item.mode }}"
notify:
- restart_rsyncd
loop:
- { src:/script/rsyncd.conf,mode:'644'}
- { src:/script/rsync.passwd,mode:'600'}
# 6.启动服务
- name: 06_start_rsync
systemd:
name: rsyncd
state: started
enabled: yes
# 7.重启服务
handlers:
- name: restart_rsyncd
systemd:
name: rsyncd
state: restarted
2、拆分
1.创建tasks/main.yml
touch /etc/ansible/roles/rsync_servers/tasks/main.yml
往tasks的主体文件中,写入拆分出来的任务列表
只需要复制原本的剧本中的 tasks任务列表,无须携带tasks这个key了,复制粘贴如下的任务列表即可,写入到该 tasks/main.yml
剧本中,依然会调用 变量信息,但是不写在这个tasks/main.yml中了
而是role角色会自动的去vars/main.yml 寻找这个变量 {{rsync_name}}
- name: 01 create_group
group:
name: "{{rsync_name}}"
gid: "{{rsync_id}}"
- name: 02 create_user
user:
name: "{{rsync_name}}"
uid: "{{rsync_id}}"
group: "{{rsync_name}}"
create_home: no
shell: /sbin/nologin
- name: 03 create_data
file:
path: "{{item}}"
state: directory
owner: "{{rsync_name}}"
group: "{{rsync_name}}"
mode: 755
loop:
- /data
- /buckup/
- name: 04 install_rsync
yum:
name: rsync
state: latest
- name: 05 copy_file
copy:
src: "{{item.src}}"
dest: /etc
mode: "{{item.mode}}"
loop:
- {src: rsyncd.conf,mode: 644}
- {src: rsync.passwd,mode: 600}
notify:
- restart_rsyncd
- name: 06 start_rsyncd
systemd:
name: rsyncd
state: started
enabled: yes
2.创建vars/main.yml
touch /etc/ansible/roles/rsync_servers/vars/main.yml
写入剧本需要用到的变量即可,也是一样,不需要添加 vars: 这个脑袋了
roles判断,只要在vars/main.yml就识别这是一个变量yml文件
写入如下信息,无须缩进
rsync_name: www
rsync_id: 666
3.files文件编写
找到你原本的配置文件所在地儿,复制到roles的files目录下即可
cp /tmp/rsync* /etc/ansible/roles/rsync_servers/files/
ls /etc/ansible/roles/rsync_servers/files/
rsyncd.conf rsync.passwd
cat rsyncd.conf
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 800
ignore errors
read only = false
list = false
auth users = rsync
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = chunjueH about rsync
path = /backup
[data]
comment = this is secord backup dir,to website data..
path = /data
cat rsync.passwd
rsync:rsync
4.创建handlers/main.yml
touch /etc/ansible/roles/rsync_servers/handlers/main.yml
- name: restart_rsyncd
systemd:
name: rsyncd
state: restarted
5.安装rsync的role创建好了,创建启动文件即可
vim /etc/ansible/rsync_server.yml
- hosts: test
roles:
- rsync_servers
6.正式运行该rsync角色
ansible-playbook rsync_servers.yml
template模块
专门用于动态替换配置文件中的值,需要学习jinja2这个模板语言,这里学习它的 创建,使用规则;以及变量替换功能;实现配置文件的变量替换
一个纯普通的文本文件,是没法识别变量的
rsyncd.conf
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_bakcup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
comment = chaoge rsync backup!
path = /backup
[data]
comment = yuchaoit.cn rsync!
path = /data
使用template模板替换配置文件的思路
第一件事,改造配置文件为 j2类型
1.创建配置文件,但是后缀必须是 j2格式的
rsyncd.j2
该j2文件写入配置
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = {{ rsync_auth_user }}
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
comment = chaoge rsync backup!
path = /backup
[data]
comment = yuchaoit.cn rsync!
path = /data
第二件事,修改vars变量文件,去替换j2文件中的变量值
只需要在vars/main.yml中写入变量即可
rsync_auth_user: "rsync_backup"
第三件事,修改tasks任务yaml文件
还得修改tasks任务yaml文件,指定配置文件路径,为j2模板形式
以部署sshd服务为演示(role角色)
1、先创建部署sshd的tasks任务文件
# mkdir -p /etc/ansible/roles/sshd_server/{files,handlers,tasks,vars,templates}
2、写入剧本语法
[root@master-61 /etc/ansible/roles/sshd_server]#vim tasks/main.yaml
# 01.复制文件
- name: 01_copy_sshd
template:
src: sshd_config.j2
dest: /etc/ssh/sshd_config
mode: '600'
backup: yes
notify:
- restart sshd
# 02.启动服务
- name: start sshd service
systemd:
name: sshd
state: started
enabled: yes
3.创建template信息
3.1、准备好 sshd_config的配置文件
cp /etc/ssh/sshd_config /etc/ansible/roles/sshd_server/templates/sshd_config.j2
3.2、修改这个sshd_config.j2文件,修改需要用变量替换的参数
修改端口
禁止公钥登录
Port {{ sshd_port }}
PubkeyAuthentication {{ pubkey_yes_no }}
4.创建变量文件,写入这个对应的变量值
vim vars/main.yml
sshd_port: "2999"
pubkey_yes_no: "no"
5.创建handlers文件,用于重启sshd
vim handlers/main.yml
- name: restart sshd
systemd:
name: sshd
state: restarted
6.检查当前服务的roles目录信息
[root@master-61 /etc/ansible/roles/sshd_server]#tree
.
├── files
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
│ └── sshd_config.j2
└── vars
└── main.yml
5 directories, 4 files
7.创建启动文件
必须和roles同级,roles角色定义的工作目录名,必须和roles/文件夹名字对应的上
# 先进入/etc/ansible目录,创建启动文件
[root@master-61 /etc/ansible]#vim start_sshd.yml
- hosts: backup
roles:
- sshd_server
8.测试剧本运行
[root@master-61 /etc/ansible/roles/sshd_server]#ansible-playbook /etc/ansible/start_sshd.yml