运维SRE-18 自动化批量管理-ansible4

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
hbinz12307
zhangsan12380
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:规范剧本相关的目录.本质规定的几个专用的目录
    按照初级方式写剧本
  1. 剧本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

主机清单
模块
剧本
  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值