网站集群批量管理-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暂不更新,赶进度~~~

相关推荐
张3234 小时前
Ansible实施任务控制
linux·ansible
张3236 小时前
Ansible Playbook
ansible
张3237 小时前
Ansible文件部署
服务器·ansible
张3238 小时前
Ansible介绍
ansible
热爱Liunx的丘丘人1 天前
Ansible的Playbook案例一
linux·运维·服务器·ansible
小梦爱安全1 天前
Ansible剧本1
java·网络·ansible
WJ.Polar1 天前
Ansible任务控制
linux·运维·网络·python·ansible
热爱Liunx的丘丘人1 天前
PlayBook常用的模块编写
linux·服务器·ansible
淼淼爱喝水1 天前
Ansible Playbook 入门实战:自动化创建 Linux 用户
linux·运维·服务器·网络·ansible
热爱Liunx的丘丘人2 天前
Ansible-doc及常用模块
linux·运维·服务器·ansible