Ansible中执行流控制

2023-12-11 10:45
文章标签 执行 ansible 流控制

本文主要是介绍Ansible中执行流控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.ansible中的迭代循环

创建目录和文件

vim createfile.yaml 

        - name: create file playbook
          hosts: all
          tasks:
            - name: create file
              file: 
                path: "/mnt/{{item['name']}}"
                state: "{{item['type']}}"

              loop: 
                - name: westosfile1
                  type: touch
                - name: westosdir1
                  type: directory
                - name: westosfile3
                  type: touch
                - name: westosdir2
                  type: directory
                - name: westosfile5
                  type: touch

ansible-playbook createfile.yaml

2.迭代循环项目

安装vsftpd、apache、dns并且开启服务,关闭对应的火墙服务

vim setup.yaml

- name: setup vsftpd apache dns
  hosts: all
  vars:
    services:
      - name: vsftpd
        service: vsftpd
        firewall_name: ftp
      - name: httpd
        service: httpd
        firewall_name: http
      - name: bind
        service: named
        firewall_name: dns
  tasks:
    - name: install services
      dnf: 
        name: "{{item['name']}}"
        state: present
      loop: 
        "{{services}}"
    - name: start services
      service:
        name: "{{item['service']}}"
        enabled: yes
        state: started
      loop:
        "{{services}}"
    - name: setup firewalld
      firewalld:
        service: "{{item['firewall_name']}}"
        state: enabled
        permanent: yes
        immediate: yes
      loop:
        "{{services}}"

ansible-playbook setup.yaml 

3.ansible中的条件语句

when :
- 条件 1
- 条件 2
# 条件判断 #
=
value == " 字符串 ",value == 数字
<
value < 数字
>
value > 数字
<=
value <= 数字
>=
value >= 数字
!=
value != 数字
is defined value
value is defined
变量存在
is not defined
value is not defined
变量不存在
in value is in value 变量为
not invalue is not in value 变量不为
bool变量 为true value                             value的值为true
bool变量 falsenot value                   value的值为false
value in value2value的值在value2列表中
# 多条条件组合 #
when
条件 1 and 条件 2
- 条件 1
- 条件 2
when :
条件 1 or 条件 2
when : >
条件 1
or
条件 2

检测文件是否存在的练习

vim check_file.yaml

- name: check file playbook
  hosts: all
  tasks:
    - name: check file
      shell: test -e /mnt/westosfile
      ignore_errors: yes               -------------------》将会忽略任务失败使得下面的任务继续运行
      register: check_state

    - name: file is not exist
      debug:
        msg: file is not exist
      when: check_state.rc != "0"

    - name: file exist
      debug:
        msg: file exist
      when: check_state.rc == "0"

ansible-playbook check_file.yaml 

vim setup_firewalld.yaml

- name: setup vsftpd apache dns
  hosts: all
  vars:
    services:
      - name: vsftpd
        service: vsftpd
        firewall_name: ftp
      - name: httpd
        service: httpd                     -----------------》此firewall_naem
      - name: bind
        service: named
        firewall_name: dns
  tasks:
    - name: install services
      dnf: 
        name: "{{item['name']}}"
        state: present
      loop: 
        "{{services}}"
    - name: start services
      service:
        name: "{{item['service']}}"
        enabled: yes
        state: started
      loop:
        "{{services}}"
    - name: setup firewalld
      firewalld:
        service: "{{item['firewall_name']}}"
        state: enabled
        permanent: yes
        immediate: yes
      loop:
        "{{services}}"
      when: item['firewall_name'] is defined        ---------》当firewall_name存在时才执行此任务

ansible-playbook setup_firewalld.yaml

  tasks:
    - name: install services
      dnf: 
        name: "{{item['name']}}"
        state: present
      loop: 
        "{{services}}"

      when:   inventory_hostname in groups['westos1']   -----------》只在westos1列表中的主机中执行此任务

  tasks:
    - name: install services
      dnf: 
        name: "{{item['name']}}"
        state: present
      loop: 
        "{{services}}"

      when:   

        - inventory_hostname in groups['westos1']   -----------》只在westos1列表中的主机中执行此任务

        - item['firewall_name'] is defined                 -----------》多条件时的格式

4.ansible中的触发器

notify :
触发器当遇到更改是触发 handlers
handlers
触发器触发后执行的动作

 [root@ansible ~]# chmod 755 /etc/vsftpd/vsftpd.conf 

 cp /etc/vsftpd/vsftpd.conf vsftpd.conf.j2

vim vsftpd.conf.j2

        anonymous_enable={{state}}

vim vsftpd.yaml

- name: install ftp server
  hosts: all
  vars:
    state: YES
  tasks:
    - name: install vsftpd
      dnf:
        name: vsftpd
        state: present
    - name: start vsftpd
      service:
        name: vsftpd
        state: started
        enabled: yes
    - name: set vsftpd.conf
      template:
        src: ./vsftpd.conf.j2
        dest: /etc/vsftpd.conf
      notify: restart vsftpd                        ---------》触发器,当更改时才会触发handlers的内容

  handlers:
    - name: restart vsftpd
      service:
        name: vsftpd
        state: restarted

ansible-playbook vsftpd.yaml

5.忽略错误play

play 遇到任务失败是会终止
ignore_errors : yes
将会忽略任务失败使下面的任务继续运行

例如下载一个根本不存在的东西,但是后续的任务依旧可以继续

vim ignore_errors.yaml 
 

- name: setup 
  hosts: all
  tasks:
    - name: vsftpd
      dnf: 
        name: aaaaaaa
        state: present
      ignore_errors: yes

    - name: show message
      debug:
        msg: hello

ansible-playbook ignore_errors.yaml

6.强制触发器运行

force_handlers
# 作用
# 当任务失败后 play 被终止也会调用触发器进程
继续使用之前的vsftpd.conf文件实验

vim vsftpd.yaml 

- name: test
  hosts: all
  vars:
    state: NO
  force_handlers: yes                      ------------》强制触发触发器
  tasks:
    - name: config ftp
      template:
        src: ./vsftpd.conf.j2
        dest: /etc/vsftpd.conf
      notify: restart vsftpd

    - name: install aaaaaa
      dnf:
        name: aaaaaa
        state: present

  handlers:
    - name: restart vsftpd
      service:
        name: vsftpd
        state: restarted

ansible-playbook vsftpd.yaml 

7.控制play运行状态

changed_when
# 作用
# 控制任务在何时报告它已进行更改

强制视为执行成功状态

vim vsftpd.yaml 

- name: test
  hosts: all
  vars:
    state: NO
  force_handlers: yes
  tasks:
    - name: config ftp
      template:
        src: ./vsftpd.conf.j2
        dest: /etc/vsftpd.conf
      changed_when: true                ----------》强制视为执行成功状态
      notify: restart vsftpd

    - name: install httpd
      dnf:
        name: httpd
        state: present

  handlers:
    - name: restart vsftpd
      service:
        name: vsftpd
        state: restarted

ansible-playbook vsftpd.yaml 

failed_when
# 当符合条件时强制任务失败
强制视为执行失败状态
failed_when: true                ----------》强制视为执行失败状态

8.根据play运行情况选择运行动作

block: 定义要运行的任务
rescue:定义当block句子中出现失败任务后运行的任务
always定义最终独立运行的任务

vim test.yaml

- name: test
  hosts: all
  tasks:
    - name: test play
      block:
        - name: install software
          dnf:
            name: aaaaaa
            state: present
      rescue:
        - name: show message
          debug:
            msg: linux is not found
      always:
        - name: show always
          debug:
            msg: hello westos

ansible-playbook test.yaml

 当block中运行正常时,rescue中的内容就不会运行

- name: test
  hosts: all
  tasks:
    - name: test play
      block:
        - name: install software
          dnf:
            name: httpd
            state: present
        - name: show linux
          debug:
            msg: ansible linux
      rescue:
        - name: show message
          debug:
            msg: linux is not found
      always:
        - name: show always
          debug:
            msg: hello westos
 

9.运行情况判定示例

将/dev/cdrom挂载到/mnt/isodir中,如果目录不存在就创建目录。

vim mount.yaml

- name: mount /dev/cdrom play
  hosts: all
  tasks:
    - block:
        - name: check mount point
          shell: test -e /mnt/isodir
      rescue:
        - name: show message
          debug:
            msg: /mnt/iso is not exist
        - name: create mount point
          file:
            path: /mnt/isodir
            state: directory
      always:
        - name: mount cdrom
          mount:
            path: /dev/isodir
            src: /dev/cdrom
            fstype: iso9660
            state: mounted

ansible-playbook mount.yaml

这篇关于Ansible中执行流控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/480407

相关文章

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

如何使用Ansible实现CI/CD流水线的自动化

如何使用Ansible实现CI/CD流水线的自动化 持续集成(CI)和持续交付(CD)是现代软件开发过程中的核心实践,它们帮助团队更快地交付高质量的软件。Ansible,作为一个强大的自动化工具,可以在CI/CD流水线中发挥关键作用。本文将详细介绍如何使用Ansible实现CI/CD流水线的自动化,包括设计流水线的结构、配置管理、自动化测试、部署、以及集成Ansible与CI/CD工具(如Jen

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

Smarty模板执行原理

为了实现程序的业务逻辑和内容表现页面的分离从而提高开发速度,php 引入了模板引擎的概念,php 模板引擎里面最流行的可以说是smarty了,smarty因其功能强大而且速度快而被广大php web开发者所认可。本文将记录一下smarty模板引擎的工作执行原理,算是加深一下理解。 其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者