网站集群批量管理-Ansible流程控制与Roles

一、流程控制

1、handlers触发器

应用场景:一般用于分发配置文件的时候.

如果配置文件发生变化则重启服务,如果没有变化则重启.

案例01: 没有使用触发器handlers

yaml 复制代码
- hosts: web
  gather_facts: no
  tasks:
  - name: 分发配置文件 
    copy:
      src: exports
      dest: /data/exports
      backup: yes
    notify:
      - 重启服务
  handlers:
    - name: 重启服务
      systemd:
        name: nfs
        state: reloaded
  • handlers触发器,应用场景:配置文件发生变化,然后重启服务(或做其他)
  • 格式:埋雷:设置绊雷(notify:写个名字),handlers设置名字和模块
  • 注意事项:handlers放在剧本的最后,否则都会被识别为handlers.

2、when判断

用于给ans运行的task(模块)设置条件,满足或不满足条件在运行对应的模块.

应用建议: when进行判断,一般与变量一起使用.

when条件一般与facts变量或register变量一起使用.

案例02 : 如果系统是centos则 安装sl,cowsay,如果是ubuntu 则安装cmatrix

yaml 复制代码
- hosts: all
  tasks:
    - name: yum sl,cowsay
      yum:
        name: sl,cowsay
        state: installed
      when: ansible_distribution == "CentOS"
    - name: apt cmatrix
      apt:
        name: cmatrix
        state: present
      when: ansible_distribution == "Ubuntu"

ssh安全策略:禁止root账号登录

sh 复制代码
[root@nanjing ssh]# vim /etc/ssh/sshd_config 
修改内容:PermitRootLogin no
[root@nanjing ssh]# systemctl reload sshd
​
-> % ssh root@43.137.51.15
root@43.137.51.15's password:
Permission denied, please try again.
​
-> % ssh shishuwu@43.137.51.152
shishuwu@43.137.51.152's password:
[root@nanjing shishuwu]# su - root
[root@nanjing ~]# pwd
/root
  • when用于进行判断,满足/不满足条件就执行对应的模块(不满足条件的主机提示skip).
  • when一般与变量一起使用.
  • (条件1) and (条件2)
  • (条件1) or (条件2)
  • ansible_hostname is match("web|backup") #类似于grep,支持正则.
  • ansible_hostname is not match("web|backup") #取反,排除.

3、循环

因为在 Ansible 2.5 版本之后,with_items 被弃用,应该使用 looploop_control 替代。

loop 批量创建文件,批量添加用户,批量启动或重启服务.

案例03: 批量启动服务 rpcbind 然后 nfs服务

yaml 复制代码
- hosts: nfs
  gather_facts: no
  tasks: 
    - name: 重启rpcbind,nfs
      systemd: 
        name: "{{ item }}"
        state: restarted
      loop:
        - rpcbind
        - nfs
​

案例04 循环创建用户指定UID

yaml 复制代码
hosts: all
  gather_facts: no
  tasks:
    - name: add user
      user:
        shell: /bin/bash
        name: "{{ item.name }}"
        uid:  "{{ item.uid  }}"
        state: present
      loop:
        - { name: 'oldboy', uid: 2020  }
        - { name: 'lidao', uid: 2021  }
        - { name: 'lidao996', uid: 2022  }

二、剧本调试

1、检查语法与单步执行

-C --check 模拟运行,不作出改变,一些变量可能会提示报错,因为-C没有真正运行剧本

--syntax-check 只做语法检查,不运行.

高级: step 单步运行. y执行这个task,n忽略这个task,c自动运行

2、tag标签

tag标签类似于超市物品的分类,只不过tag标签是给ansible中的task进行分类.加上标记

运行剧本的时候运行指定的tag标签或排除某些tag.

sh 复制代码
ansible-playbook -i hosts -t 04.start srv 14.deploy-nfs-tag.yml

运行剧本的时候

-t 运行的标签,如果多个标签通过","分割 skip-tags 排除指定的tags,如果多个标签通过","分割

3、忽略错误

运行剧本的时候,因为重复运行导致的错误提示,并发是真的错误.

比如:目录已经存在,用户已经存在. 在这种情况下,我们可以通过ignore_errors忽略错误,让剧本可以继续运行.

sh 复制代码
ignore_errors: true

三、Jinja2模版

template模块与xxx.j2文件

应用场景:

1、进行分发配置文件或文件的时候,需要在文件中使用变量,需要使用jinja2文件 nginx.conf.j2,需要使用template模块进行分发.

2、进行判断

3、进行循环

yaml 复制代码
- hosts: all
  gather_facts: no
  tasks:
    - name: 分发motd文件 
      template:
        src: templates/motd.j2
        dest: /etc/motd
        backup: yes
    - name: 分发motd文件 
      copy:
        src: templates/motd.j2
        dest: /tmp/motd
        backup: yes

四、include文件包含

day42暂不更新,赶进度~~~

相关推荐
Hy行者勇哥2 天前
用Cursor智能编写Ansible/Terraform脚本,打通CI/CD链路
ci/cd·ansible·terraform
芷栀夏4 天前
飞牛NAS怎么部署Immich?家庭照片自动备份与远程访问教程
服务器·nginx·ansible
悠然南风14 天前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
祺风挽楠23 天前
ansible编辑
网络·ansible
芳心粽伙饭23 天前
Ansible课后作业
ansible
烁34725 天前
Ansible初识
ansible
烁34725 天前
Ansible安装部署调试
ansible
烁34725 天前
Ansible命令
ansible
小义_25 天前
【Ansible】(三)基础配置与连接设置
云原生·ansible
炸炸鱼.1 个月前
Ansible 企业级实战:Playbook 与 Roles 完全指南
网络·ansible