ansible的流程控制

Ansible 剧本的流程控制通过任务的顺序执行、条件语句(when)、循环(with_items 等)、错误处理(ignore_errors 和 block)、以及任务标签和角色来实现。可以根据条件动态控制任务执行,使用循环处理重复操作,通过块和故障恢复机制确保任务的容错性,并通过标签灵活选择任务的执行范围

handler触发器

触发条件 :Handler 只有在某个任务被标记为 changed(即执行过程中发生了变化)时才会执行。这意味着,只有当某个任务发生了更改(如文件变更、配置修改等),才会触发相关的 Handler 任务。

执行顺序:Handler 通常在 playbook 的最后执行,它们会被挂起,直到 playbook 中的其他任务发生变化并触发它们。

  • 应用场景:一般用于分发配置文件,重启服务
  • 例如:配置文件一旦有了变化,就立刻重启服务
  • 语法:notyfy 和 handerls

1.编写一个yaml,分发文件和重启服务。只有当文件发生改变时,服务才会重启

yaml 复制代码
- hosts: nfs
  tasks:
    - name: 分发配置文件
      copy:
        src: exports
        dest: /etc
    - name: 重启服务
      systemd:
        name: nfs
        state: reloaded

2.在执行了2次后,文件不再发送改变,但是服务依然重启了

3.增加触发器,让文件传输成功后才会触发服务重启

yaml 复制代码
[root@gitlabansible]# cat 08-触发器.yaml 
- hosts: web
  gather_facts: false
  tasks:
  - name: 分发配置文件
    copy:
      src: /test/ansible/file/exports
      dest: /etc
      backup: false
    notify: restart_NFS

  # 注意notify用的名字要和handlers一致

  handlers:
  - name: restart_NFS
    systemd:
      name: nfs
      state: restarted

4.增加触发器后的运行结果,没有任何变化。文件没有传输,自然服务也就不会重启。避免了没必要的重启。

如果设置了备份,备份后的文件名是:/etc/exports.3391.202-0X-12@22:09:29~

wen判断

  • 通常用于满足了条件再运行

判断facts变量案例

1.要求CentOS系统安装sl,Ubuntu安装cmatrix。判断faxts变量中的id即可实现。

yaml 复制代码
- hosts: all
  tasks:
    - name: CentOS安装sl
      yum:
        name: sl
        state: present
      when: ansible_distribution == "CentOS"

    - name: Ubuntu安装cmatrix
      yum:
        name: cmatrix
        state: present
      when: ansible_distribution == "Ubuntu"

可以看到图中出现了一种蓝色状态skipping,表示跳过。nfs服务器属于Centos,不在安装cmatrix的范围。

案例:配置文件错误则不重启

1.需求:管理端传输nginx配置文件。若nginx配置文件正确,则重启nginx;若错误,则不重启nginx。

  • handlers触发器:什么时候重启?
  • when判断:正确还是错误?
    • 判断的是ngin -t的结果

1.实现:判断 nginx 返回的状态码是否为0。如果为0就重启nginx

yaml 复制代码
- hosts: web
  gather_facts: false
  tasks:
  - name: 分发nginx.conf
    copy:
      src: /test/ansible/file/test.conf
      dest: /etc/nginx/conf.d/test.conf
      backup: false

  - name: 检测nginx -t
    shell: nginx -t
    register: result
    ignore_errors: true

  - name: 打印出nginx result
    debug:
      msg: "nginx: {{ result.stdout }}"
    
  - name: 是否重启nginx
    systemd:
      name: nginx
      state: restarted
    when: result.rc == 0

2.当nginx配置错误的情况下:

3.当nginx配置文件正确的情况下:

when的字符正则

match语法
is match 匹配
is not match 排除
bl.rc return code
其他判断符号
!= 不等于

在判断Ubuntu中,改为:when: ansible_distribution is match (".*buntu"),也能安装cmatrix

判断总结

when判断 示例
==
is match
is search 搜索查找
or
!=
&& when: ansible_distribution is match (".*buntu") and ansible_hostname is match (".*sk")

ansible中的循环

  • 批量创建文件,批量添加用户,批量启动或重启服务
  • item:作为内置变量,不能随意更改

1.案例,使用循环重启nfs和rpcbind

yaml 复制代码
- hosts: web
  gather_facts: false
  tasks:
  - name: 批量重启服务
    systemd:
      name: '{{ item }}'
      state: restarted
      enabled: yes
    with_items:
    - rpcbind
    - nfs

启动顺序:在上面的先启动

执行结果如下:

bash 复制代码
[root@gitlabansible]# ansible-playbook -i hosts 07-item循环重启服务.yaml 

PLAY [web] *******************************************************************************************************

TASK [批量重启服务] ****************************************************************************************************
changed: [10.0.0.62] => (item=rpcbind)
changed: [10.0.0.62] => (item=nfs)

PLAY RECAP *******************************************************************************************************
10.0.0.62                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

2.案例,使用 loop 循环批量创建用户

yaml 复制代码
- hosts: web
  gather_facts: false
  tasks:
  - name: create user
    user:
      name: '{{ item.name }}'
      uid: '{{ item.uid }}'
      state: present
    loop:
    - { name: 'user1', uid: '2001' }
    - { name: 'user2', uid: '2002' }
    - { name: 'user3', uid: '2003' }

❗️创建出来的用户在CentOS上解释器是/bin/bash,Ubuntu却是/bin/dash;最好指定解释器。

yaml 复制代码
cat 04-items-批量创建用户.yaml <<EOF
- hosts: web
  gather_facts: false
  tasks:
    - name: 01 create directory
      file:
        path: "{{ item }}"
        state: directory
      loop:
      - /tmp/test01
      - /tmp/test02
      - /tmp/test03
      - /tmp/tmp01
      - /tmp/tmp02
      - /tmp/tmp03
EOF

3.案例,变量创建文件,并设施不同的权限

yaml 复制代码

tags标签

作用

  • 用处:在调试剧本时,可以运行自定义的步骤
  • 语法:卸载tasks下面
tags选项
step1,step2 执行多个标签
--skip-tags 排除标签

1.给分发配置文件的步骤打上标签

yaml 复制代码
- hosts: web
  gather_facts: false
  tasks:
  - name: 分发nginx.conf
    copy:
      src: /test/ansible/file/test.conf
      dest: /etc/nginx/conf.d/test.conf
      backup: false
    tags:
    - 01-file

  - name: 检测nginx -t
    shell: nginx -t
    register: result
    ignore_errors: true

  - name: 打印出nginx result
    debug:
      msg: "nginx: {{ result.stdout }}"
    ignore_errors: true
    
  - name: 是否重启nginx
    systemd:
      name: nginx
      state: restarted
    when: result.rc == 0

  - name: restart nfs
    systemd:
      name: nfs
      state: restarted

2.执行带有标签的步骤,这样就不会执行 nfs、nginx 重启了

指定调式位置

ansible的playbook,有一些任务,在运行中出错了,有什么办法从失败的位置开始吗?

这个可以使用tag的方式,将之后的都打上tag,执行的时候加上 -t 标签。只执行打标签的任务,也可以-skip-tags,执行这个标签之外的任务

ansible的剧本调试

命令
ansible-playbook -C 模拟运行
ansible-playbook --syntax-check 语法检测,不模拟运行

ignore_erros忽略错误

  • 用途:忽略剧本运行时的非语法错误,例如要安装的软件找不到...
  • 语法:ignore_erros: true/false
yaml 复制代码
- hosts: nfs
  tasks:
    - name: 01下载nfs
      yum:
        name: abcde,aabbcc
        state: installed
      tags:
        - 01.install
      ignore_errors: yes
| `ansible-playbook --syntax-check` | 语法检测,不模拟运行 |



## ignore_erros忽略错误

- 用途:忽略剧本运行时的非语法错误,例如要安装的软件找不到...
- 语法:**ignore_erros: true/false**

```yaml
- hosts: nfs
  tasks:
    - name: 01下载nfs
      yum:
        name: abcde,aabbcc
        state: installed
      tags:
        - 01.install
      ignore_errors: yes
相关推荐
零基础1238 分钟前
VoiceStudio 开源项目深度解析:特性、对比与实战测试
人工智能·经验分享·python·开源
2601_9628857212 分钟前
如何用 Python 做均线粘合选股?(多头发散前的变盘候选)
开发语言·python
zhangzeyuaaa14 分钟前
Ruby 方法参数完全指南:默认值、可变参数与关键字参数
前端·python·ruby
小小张说故事20 分钟前
pytest 写了用例却不跑、fixture 不生效、参数化全失效?9 个高频坑对照表
python
外收内放31 分钟前
08 | 优化篇③ 60 张动作立绘和 50 张特效贴图是怎么进游戏的
python·游戏·pygame
weixin_4038101333 分钟前
EasyClick iOS 免越狱自动化脚本怎么写:从环境判断到跑通第一个脚本
运维·ios·自动化
计算机毕业编程指导师44 分钟前
【计算机毕设推荐】基于Hadoop+Django的LLM多维度性能评估分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·django·毕业设计·课程设计·llm性能
AC赳赳老秦1 小时前
OpenClaw 与 FineBI 联动方案:公开数据自动采集与实时业务分析看板实践
大数据·开发语言·python·php·finebi·deepseek·openclaw
计算机毕业编程指导师1 小时前
【Python毕设选题推荐】基于Hadoop+Django的奥斯卡奖获奖数据可视化分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·毕业设计·课程设计·奥斯卡奖
风早爽太1 小时前
Python 学习笔记:数据库迁移工具 ‌Alembic
数据库·python·fastapi·alembic