ansible——实施任务控制

1. 编写循环和条件任务

在playbook中使用循环,直接用loop关键字即可,有多种使用方法;
简单循环:

---
 - name: test
  hosts: rhel8_no1.test.com
  tasks:
    - name: apache and vsftpd is running
      service:
         name: "{{item}}"    ##循环变量item ,从loop中取值
         state: started
      loop:
        - httpd
        - vsftpd

将变量放入列表:

---
 - name: test
  hosts: rhel8_no1.test.com
  vars:     ##定义变量
     web_service:
            - httpd
            - vsftpd
  tasks:
    - name: apache and vsftpd is running
      service:
         name: "{{item}}"
         state: started
      loop:  "{{web_service}}"

循环散列或字典列表:

---
 - name:   loop test
  hosts: rhel8_no1.test.com
  tasks:
     - name: User test
       user:
          name: "{{item.name}}"
          state: present
          groups: "{{item.groups}}"
       loop:
         - name: student
           groups: student
         - name: redhat
           groups: root

早些版本的循环,使用 with_items:

---
 - name:   loop test
  hosts: rhel8_no1.test.com
  vars:
      data:
           - user1
           -  user2
           -  user3
  tasks:
       - name: "with_items"
         debug:
             msg:  "{{item}}"
         with_items: "{{data}}"         

register 和 loop 一起使用:

---
 - name: loop register test
  gather_facts: no
  hosts: localhost
  tasks:
      - name: loop echo task
        shell: "echo This is my item: {{ item }}"
        loop:
           - one
           - two
        register: echo_results
      - name: Show echo results variable
        debug:
           var: echo_results

2. 条件任务语法

在ansible中,使用条件判断的关键字就是when,在表达式中你能够使用任何的变量或者fact,当表达式的结果返回的是false,便会跳过本次的任务。
简单布尔值测试:

---
 - name: Boolean test
  hosts: rhel8_no1.test.com
  vars:
      run_my_task: true  ##定义变量
  tasks:
      - name: httpd is installed
        yum:
          name: httpd
        when: run_my_task   ##当run_my_task的值为true时,安装任务才会执行

测试变量是否有值:

---
 - name: Boolean test
  hosts: rhel8_no1.test.com
  tasks:
      - name: user test
        user:
          name: student
          state: present
        when: my_service is defined   ##如果定义了  my_service这个变量,则执行判断用户是否存在的任务

以上palybook未定义my_service变量,任务不会被执行
在这里插入图片描述
条件表达式写法:

表达式作用
A== “B”A与字符串B相等
A == 100等于(数字)
<小于
>大于
<=小于等于
>=大于等于
!=不等于
xxx is defined变量存在
xxx is not defined变量不存在
1、true、yes均为布尔值 true
0、false、no均为布尔值 false
A in B第一个变量的值存在,且在第二个变量的列表中

示例:如果vsftpd服务正在运行,则重启httpd服务

---
- name: Restart httpd if vsftpd is running
  hosts: rhel8_no1.test.com
  tasks:
     - name: Get vsftpd status
       command: /usr/bin/systemctl is-active vsftpd   ##判断vsftpd服务的状态
       ignore_errors: yes   ##如果 vsftpd 没运行或失败,则忽略
       register: result       ###定义变量保存结果

     - name: Restart httpd
       service:
          name: httpd
          state: restarted
       when: result.rc == 0   ###退出码为 0,则重启 httpd

逻辑运算符:

  • and:逻辑与,当左边和右边两个表达式同时为真,则返回真
  • or:逻辑或,当左右和右边两个表达式任意一个为真,则返回真
  • not:逻辑否,对表达式取反
  • ():当一组表达式组合在一起,形成一个更大的表达式,组合内的所有表达式都是逻辑与的关系

3. 练习

①:vim test1.yml ##编写playbook,对web组的受管主机安装vsftpd和httpd软件,当主机的操作系统版本号为8.0时开启vsftpd与httpd服务

---
- name: httpd and vsftpd is running
  hosts: web
  vars:
    web_pkg:
       - vsftpd
       - httpd
  tasks:
     - name: web_service is installed
       yum:
           name: "{{item}}"
           state: present
       loop: "{{web_pkg}}"
     - name: Start httpd and vsftpd
       service:
            name: "{{item}}"
            state: started
            enabled: true
       loop: "{{web_pkg}}"
       when: ansible_distribution_version == "8.0"

②:ansible-playbook test1.yml ##运行playbook,输出结果说明所有主机安装软件成功,rhel7_no1.test.com主机未执行开启httpd,vsftpd服务的任务
在这里插入图片描述
③:查看受管主机的操作系统版本 ,rhel7_no1.test.com主机版本号为 7.6
在这里插入图片描述
④:查看受管主机上的httpd,vsftpd服务状态,验证实验结果
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值