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

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推