12.2handles
- handles触发器(条件),满足条件后再做什么事情
- 应用场景:想表示:配置文件变化,再重启服务
配置handlers之前,每次运行剧本都会重启nfs,无论配置文件是否变化。
[root@m01 /server/ans/playbook]# cat 17-handler-nfs-server.yml
---
- hosts: db
tasks:
- name : 01.分发配置
copy:
src: ./exports
dest: /etc/exports
backup: yes
- name : 05 启动服务nfs
systemd:
name: nfs
enabled: yes
state: restarted
不管exports配置有无修改,都会执行05启动nfs服务
配置了handerles,只有服务配置文件变化了再重启服务。
[root@m01 /server/ans/playbook]# cat 17-handler-nfs-server.yml
---
- hosts: db
tasks:
- name : 01.分发配置
copy:
src: ./exports
dest: /etc/exports
backup: yes
notify:
- restart nfs #与下面handlers的name一样
handlers:
- name: restart nfs
systemd:
name: nfs
enabled: yes
state: restarted
12.3 when(判断)
when是ansible中的判断语句(条件语句)
实现对于某个模块在满足或不满足xxxxx条件下再执行
给web服务器或lb服务器,配置nginx的yum源
when: ( ansible_distribution == 'Ubuntu') #如果系统的发行版本是Ubuntu则运行模块ansible_distribution的ansible-facts变量
when: ( ansible_hostname is match("web|lb") ) #主机名包含web或lb,配置nginx源
when: ( ansible_hostname is not match("web|lb") )
cat nginx.repo
[nginx]
baseurl = http://nginx.org/packages/centos/$releasever/$basearch/
enabled = 1
gpgcheck = 0
name = nginx stable repo
cat 18-when-fenfa-nginx-yum.yml
---
- hosts: all
tasks:
- name: 配置lb或者web的nginx yum源
copy:
src: ./nginx.repo
dest: /etc/yum.repos.d/nginx.repo
backup: yes
when: ( ansible_hostname is match("web|lb") )
12.4 循环
批量启动,重启服务
案例01-批量重启服务:crond,nfs,rpcbind
cat 19-item-restart-service.yml
---
- hosts: nfs
gather_facts: no
tasks:
- name: restart 多个服务
systemd:
name: "{{ item }}"
state: restarted
with_items:
- crond
- rpcbind
- nfs
案例02-循环添加用户并指定uid
- ansible中2个或多个变量的循环语句格式.
用户名 | uid |
---|---|
hbinz | 12307 |
zhangsan | 12380 |
cat 20-item-duo-var-useradd.yml
---
- hosts: all
tasks:
- name: 批量添加用户
user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
state: present
with_items:
- { name: "hbinz" , uid: "12307" }
- { name: "zhangsan" , uid: "12308" }
循环小结:
with_items:实现循环,变量名字item,多个变量循环了解即可
注:这里的with_items可以替换成loops
12.5 Jinja2模板
经常使用在配置文件中,让配置文件中包含变量
copy模块没有解析变量
template模块传输的时候解析配置文件变量(ansible),配置文件格式改为exports.j2
cat 21-jinja-fenfa-conf.yml
---
- hosts: nfs
tasks:
- name: 分发nfs配置文件,加主机名
template:
src: ./exports.j2
dest: /etc/exports
ansible-playbook -i hosts 21-jinja-fenfa-conf.yml
nfs01的exports:
[root@nfs01 ~]# cat /etc/exports
# nfs01 nfs配置文件
/data 172.16.1.0/24(rw,all_squash)
- 使用jinja2模板要求
- 配置文件必须要以.2结尾(ansible)
- 分发文件的时候,使用template模块,用法与copy一致
案例02-jinja2循环
批量共享目录/data /backup /nfsdata
cat exports.j2
# {{ ansible_hostname}} nfs配置文件
{% for name in ["/data","/backup","/nfsdata"] %}
{{name}} 172.16.1.0/24(rw,all_squash)
{% endfor %}
--------------------------------------------------
[root@nfs01 ~]# cat /etc/exports
# nfs01 nfs配置文件
/data 172.16.1.0/24(rw,all_squash)
/backup 172.16.1.0/24(rw,all_squash)
/nfsdata 172.16.1.0/24(rw,all_squash)
核心掌握:
- 配置文件xxxx.j2+template模块
- jinja2配置文件支持ans变量.
12.6 Roles
- roles:规范剧本相关的目录.本质规定的几个专用的目录
按照初级方式写剧本
- 剧本nfs服务端
---
- hosts: nfs
tasks:
- name: 01.部署nfs服务端软件
yum:
name: nfs-utils
state: installed
- name: 02.修改配置文件
template:
src: ./exports.j2
dest: /etc/exports
backup: yes
notify:
- 04.启动服务-rpcbind-nfs服务
- name: 03.创建对应的目录和,权限
file:
path: /data/
owner: nfsnobody
group: nfsnobody
state: directory
handlers:
- name: 04.启动服务-rpcbind-nfs服务
systemd:
name: "{{ item }}"
enabled: yes
state: restarted
with_items:
- rpcbind
- nfs
a)roles结构
b)环境准备及部署流程
- 1.先书写或拆分剧本中tasks的内容
- 2.根据剧本,分类存放配置文件,模板文件(j2)
- 3.根据剧本,配置handlers的main.yaml文件
- 4.书写剧本入口.与nfs-server目录同级
mkdir -p roles
cd roles
mkdir -p nfs-server/{files,templates,tasks,handlers}
[root@m01 /server/ans/playbook/roles]# tree -F
.
└── nfs-server/
├── files/
├── handlers/
├── tasks/
└── templates/
c)先书写拆分或拆分剧本中tasks的内容.
[root@m01 /server/ans/playbook/roles]# cat nfs-server/tasks/main.yml
- name: 01.部署nfs服务端软件
yum:
name: nfs-utils
state: installed
- name: 02.修改配置文件
template:
src: ./exports.j2
dest: /etc/exports
backup: yes
notify:
- 04.启动服务-rpcbind-nfs服务
- name: 03.创建对应的目录和,权限
file:
path: /data/
owner: nfsnobody
group: nfsnobody
state: directory
d)根据剧本,分类存放配置文件,模板文件(j2)
[root@m01 /server/ans/playbook/roles]# cat nfs-server/templates/exports.j2
# {{ ansible_hostname}} nfs配置文件
/data/ 172.16.1.0/24(rw,all_squash)
[root@m01 /server/ans/playbook/roles]# tree -F
.
└── nfs-server/
├── files/
├── handlers/
├── tasks/
│ └── main.yml
└── templates/
└── exports.j2
5 directories, 2 files
e)根据剧本,配置handlers的main.yml文件
[root@m01 /server/ans/playbook/roles]# cat nfs-server/handlers/main.yml
- name: 04.启动服务-rpcbind-nfs服务
systemd:
name: "{{ item }}"
enabled: yes
state: restarted
with_items:
- rpcbind
- nfs
[root@m01 /server/ans/playbook/roles]# tree -F
.
└── nfs-server/
├── files/
├── handlers/
│ └── main.yml
├── tasks/
│ └── main.yml
└── templates/
└── exports.j2
f)书写入口剧本,与nfs-server目录同级
[root@m01 /server/ans/playbook/roles]# cat top.yml
---
- hosts: nfs
roles:
- role: nfs-server #与目录名字一致,ans才能找到下个入口
[root@m01 /server/ans/playbook/roles]# tree -F
.
├── nfs-server/
│ ├── files/
│ ├── handlers/
│ │ └── main.yml
│ ├── tasks/
│ │ └── main.yml
│ └── templates/
│ └── exports.j2
└── top.yml
g)roles执行流程
- 1.ansible-playbook -i host top.yml
- 2.读取top.yml内容获取roles信息
- 3.根据顺序先执行第1个role—>nfs-server
- 4.执行nfs-server,找nfs-server对应的目录
- 5.执行里面的tasks下面的main.yml
- 6.执行mian.yml的时候,遇到copy/template模块则找对应的目录copy(files),template(templates),找对应的文件
- 7.执行main.yml的时候,遇到notify,则会找handlers下面的main.yml的内容,进行匹配和执行。
12.7 Galaxy-了解
官方roles集合
ansible-galaxy install geerlingguy.nginx
12.8 ansible-vault-了解
加密文件
ansible-vault encrypt hosts #加密配置文件,设置密码
ansible --ask-vault-pass -i hosts all -m ping #使用ansible命令或ansible-playbook命令需要加上 --ask-vault-pass
13.Ansible-进阶-优化
/etc/ansible/ansible.cfg
inventory = /etc/ansible/hosts #指定的默认的主机清单. 未来可以修改为 ./hosts 就可以不用加上-i
forks = 50 #并发数量. 可以增加这个数量获取更快批量管理效率.
sudo_user = root #配置下被管理端具有sudo权限的用户,并且修改/etc/sudoers 注释掉requiretty
host_key_checking = False #默认是True 连接新的主机要进行验证. 建议关闭,加速.
log_path = /var/log/ansible.log #默认没有开启.
ssh_args = -C -o ControlMaster=auto -o
ControlPersist=6d #连接的保持时间. 6d 10d
pipelining = True #加速,加速连接合并不必要的连接. 要求:不能使用sudo,如果使用则不能开启.
14.总结Ansblie
主机清单
模块
剧本