1. ✅ansible变量
1.1. 📝列表变量
fruits:
- "苹果"
- "香蕉"
- "火龙果"
python中需要写在一行
fruits = ["苹果","香蕉","火龙果"]
列表搭配着循环使用
1.2. 🔐字典变量
rsync_server:
ip: "172.16.1.41"
module: blog
bak_dir: /nfs/backup/blog/
user: www
userid: 1999
password: "rsync_backup:1"
- hosts: nfs
vars:
nfs_server:
ip: "10.0.0.31"
dir: "/nfs/backup/blog/"
user:
- "zhu"
- "zbl"
user_id:
- { name: "zhu01",uid: "1000" }
- { name: "zhu02",uid: "1001" }
tasks:
- name: print
debug:
msg: |
nfs服务器ip: {{ nfs_server.ip }}
nfs服务器目录: {{ nfs_server.dir }}
nfs服务器用户: {{ nfs_server.user }}
- name: print
debug:
msg: |
nfs服务器ip: {{ nfs_server.ip }}
nfs服务目录: {{ nfs_server.dir }}
nfs服务器用户: {{ item.name }}
nfs服务器用户id: {{ item.uid }}
loop: "{{ nfs_server.user_id }}"
ansible-playbook -i hosts 19.nfs_info.yml

2. ✅handlers
- 触发器:模块状态变化(分发配置文件,文件内容变化),然后触发handlers内容
- 问题:分发配置文件后,服务是启动还是重启?
- 需求:配置文件变化或为变化,变化后需要重启服务
#notify+handlers
1.分发配置
2.启动服务(正常)
3.重启服务(配置变化后)
1.编写playbook剧本
[root@m02 /server/ans/playbooks]# vim 20.handlers.yml
- hosts: nfs
tasks:
- name: 分发配置文件
template:
src: ./files/exports.j2
dest: /tmp/exports
notify:
- 重启服务
handlers:
- name: 重启服务
systemd:
name: nfs
state: reloaded
2.运行playbook剧本
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 20.handlers.yml
3. ✅ansible目录规范roles结构
roles/
└── role_name/ # 角色名称
├── defaults/ # 默认变量(优先级最低)
│ └── main.yml
├── vars/ # 内部变量(优先级高于 defaults)
│ └── main.yml
├── tasks/ # 任务列表
│ └── main.yml
├── handlers/ # 处理器(如重启服务)
│ └── main.yml
├── templates/ # Jinja2 模板文件
├── files/ # 静态文件(如配置文件)
├── meta/ # 元数据(依赖关系等)
│ └── main.yml
└── README.md # 可选:角色说明文档
└── group_vars/all/main.yml #共享变量
└── hosts #主机清单
└── ansible.cfg #ansible配置文件
└── top.yml #主剧本(运行此剧本)
4. ✅ansible部署rsync服务
mkdir -p rsync_server/{files,tasks,handlers,templates}

- 2️⃣在group_vars/all/main.yml中定义变量列表
rsync_server:
ip: "172.16.1.41"
module: blog
bak_dir: /nfs/backup/blog/
user: www
userid: 1999
password: "rsync_backup:1"
- name: 1.安装rsync软件包
yum:
name: rsync
state: latest
tags:
- install
- name: 2.修改配置文件
template:
src: rsyncd.conf.j2
dest: /etc/rsyncd.conf
backup: yes
notify:
restart_rsyncd
- name: 3.添加www虚拟用户
user:
name: "{{ rsync_server.user }}"
uid: 1999
shell: /sbin/nologin
create_home: no
state: present
- name: 4.创建/nfs/backup/blog/备份目录,修改所有者
file:
path: "{{ rsync_server.bak_dir }}"
owner: "{{ rsync_server.user }}"
group: "{{ rsync_server.user }}"
state: directory
- name: 5.添加密码文件,权限为600
lineinfile:
path: /etc/rsyncd.passowrd
line: "{{ rsync_server.password }}"
owner: root
group: root
mode: '0600'
create: yes
- name: 6.启动rsyncd服务
systemd:
name: rsyncd
enabled: yes
state: started
- 4️⃣在templates目录下创建rsyncd.conf.j2模板文件
##rsyncd.conf start##
fake super = yes
uid = {{ rsync_server.user }}
gid = {{ rsync_server.user }}
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
#hosts allow = 10.0.0.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
[{{ rsync_server.module }}]
comment = path
path = {{ rsync_server.bak_dir }}
- 5️⃣在handlers目录下编写handlers
- name: restart_rsyncd
systemd:
name: rsyncd
state: restarted
- 6️⃣在roles目录下编写主top.yml主playbook
- hosts: bak
roles:
- rsync_server
ansible-playbook top.yml

ansible bak -m shell -a 'systemctl status rsyncd'

5. ✅ansible部署nfs服务
mkdir -p rsync_server/{files,tasks,handlers,templates}

- 2️⃣在group_vars/all/main.yml中定义变量列表
nfs_server:
ip: "172.16.1.31"
nfs_dir: /nfs/blog/uploads/
user: www
userid: 1999
- 3️⃣在nfs_server/templates目录下创建exports.j2模板文件
{{ nfs_server.nfs_dir }} 172.16.1.0/24(rw,all_squash,anonuid=1999,anongid=1999)
- name: 1.安装rpcbind,nfs-utils软件包
yum:
name: rpcbind,nfs-utils
state: latest
- name: 2.修改配置文件
template:
src: exports.j2
dest: /etc/exports
backup: yes
notify:
reload_nfs
- name: 3.添加www虚拟用户
user:
name: "{{ nfs_server.user }}"
uid: "{{ nfs_server.userid }}"
shell: /sbin/nologin
create_home: no
state: present
- name: 4.创建共享目录,修改所有者
file:
path: "{{ nfs_server.nfs_dir }}"
owner: "{{ nfs_server.user }}"
group: "{{ nfs_server.user }}"
state: directory
- name: 5.启动rpcbind服务
systemd:
name: "{{ item }}"
enabled: yes
state: started
loop:
- rpcbind
- nfs-utils
- hosts: nfs
roles:
- role: nfs_server
ansible-playbook top.yml

ansible nfs -m shell -a 'showmount -e'

6. ✅ansible调试功能
6.1. 🔍语法检查
ansible-playbook -C top.yml
-C 模拟运行剧本,检查错误,register变量无法使用
--syntax-check 语法检查,不运行
6.2. ☀️显示执行详细过程
ansible-playbook -vvv top.yml
6.3. 🎯tag标签
- name: 1.安装rsync软件包
yum:
name: rsync
state: latest
tags:
- install
- name: 2.修改配置文件
copy:
src: rsyncd.conf
dest: /etc/rsyncd.conf
backup: yes
tags:
- config
notify:
restart_rsyncd
- name: 3.添加www虚拟用户
user:
name: www
uid: 1999
shell: /sbin/nologin
create_home: no
state: present
tags:
- config
- name: 4.创建/nfs/backup/blog/备份目录,修改所有者
file:
path: "{{ bak_dir }}"
owner: www
group: www
state: directory
tags:
- config
- name: 5.添加密码文件,权限为600
:
path: /etc/rsyncd.passowrd
line: "rsync_backup:1"
owner: root
group: root
mode: '0600'
create: yes
tags:
- config
- name: 6.启动rsyncd服务
systemd:
name: rsyncd
enabled: yes
state: started
tags:
- start
ansible-playbook -i hosts --list-tags top.yml

ansible-playbook -i hosts -t config top.yml

ansible-playbook -i hosts --skip-tags install top.yml

7. ✅ansible优化
7.1. 🚀性能优化
- 1️⃣配置文件目录的优化(roles)
- 2️⃣关闭facts变量
- 3️⃣主机清单优化
- 4️⃣管理并发数优化
[defaults]
host_key_checking = False
deprecation_warnings = False
interpreter_python=/usr/bin/python3
gathering = explicit
inventory = ./hosts
forks = 10
[inventory]
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]
7.2. 🔐安全优化
7.2.1. vault加密/解密
- vault加密,敏感信息加密(主机清单⽂件中有密码,剧本中有敏感信息)
ansible-vault encrypt 文件(剧本,主机清单文件) #1.加密
ansible/ansible-playbook --ask-vault-pass xxxx #2.运行
ansible-vault decrypt 文件(剧本,主机清单文件) #3.解密
7.2.2. 配置sudo
-
- 配置sudo⽤⼾ ans ALL=(ALL) NOPASSWD: ALL
- 配合vpn,jumpserver⼀起使⽤
- ⽤⼾--->vpn---->jumpserver(跳板机)---->ansible
- ⽤⼾的密码,进⾏加密( hash, ansible-vault)
- 所有被管理节点上添加ansible用户,设置密码
- 所有被管理节点上配置ansible sudo权限ans ALL=(ALL) NOPASSWD: ALL
- 管理端与被管理端密钥认证:分发密钥发到ans⽤⼾.
- 管理端: ansible.cfg配置,通过ans⽤⼾连接,远程连接端⼝号, 使⽤sudo.
1.添加ans用户
ansible all -m shell -a 'echo "ans ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers'
ansible all -m shell -a 'useradd ans'
ansible all -m shell -a 'echo zhubl996 |passwd --stdin ans'
2.修改ansible配置文件
vim /etc/ansible/ansible.cfg
[defaults]
sudo_user = ans ##被管理端上具有sudo权限的用户 nopasswd: ALL
remote_user = ans ##被管理端使用的用户,不指定默认是当前用户/root
remote_port = 22 ##被管理端ssh端口号
host_key_checking = False
log_path = /var/log/ansible.log
[inventory]
[privilege_escalation]
become=True ##开启sudo功能
become_method=sudo ##使用sudo命令
become_user=root ##普通用户切换为root
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]
3.重新分发密钥给ans普通用户.
ssh-copy-id ans@172.16.1.7 ...所有节点都要分发密钥.
4.测试
ansible all -m ping
连接到某一台机器修改ssh配置文件关闭root远程登录功能.
修改/etc/ssh/sshd_config
sed
PermitRootLogin=no
8. ✅总结
- 主机清单
- ansible模块
- ansible剧本(变量,判断,循环)
- ansible roles
- 调试 -C/tags,ignore_errors
- jinja2模板文件
- 优化
- 最终目标:书写各种服务的剧本(通过变量控制剧本)相当于变量就是剧本的入口
