ansible-role

发布时间 2023-08-15 21:23:01作者: 村尚chun叔

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