Ansible学习笔记——loop、when条件控制

本文介绍了Ansible中loop循环的使用,包括简单循环、通过变量定义循环、循环字典列表以及如何通过循环读取register变量。此外,还详细讲解了when条件控制的运用,展示了在不同条件下任务的执行情况。最后,通过实例展示了如何结合循环和条件控制安装软件。
摘要由CSDN通过智能技术生成

loop循环

简单循环

在task下定义一个loop,通过item变量取出loop的值

tasks:
    - name: 1)
      debug: 
        msg: "this vaule is {{ item }}"
      loop:
        - aaa
        - bbb
        - ccc

运行结果

TASK [1)] ****************************************************************************************************************************
ok: [servera] => (item=aaa) => {
    "msg": "this vaule is aaa"
}
ok: [servera] => (item=bbb) => {
    "msg": "this vaule is bbb"
}
ok: [servera] => (item=ccc) => {
    "msg": "this vaule is ccc"
}

通过变量定义循环

定义一个变量列表,可以通过引用变量,取到item的值

 vars:
    name:
      - aaa
      - bbb
  tasks:
    - name: 1)
      debug: 
        msg: "this vaule is {{ item }}"
      loop:
        "{{ name }}"

结果:

TASK [1)] ****************************************************************************************************************************
ok: [servera] => (item=aaa) => {
    "msg": "this vaule is aaa"
}
ok: [servera] => (item=bbb) => {
    "msg": "this vaule is bbb"
}

循环字典列表

通过定义一个字典列表,可分别针对每个item增加属性

 tasks:
    - name: 1) check service status
      debug:
        msg: "this is the {{ item.key }} vars {{ item.value }}"
      loop:
        - key: 1
          value: aaa
        - key: 2
          value: bbb

运行结果:

TASK [1) check service status] *******************************************************************************************************
ok: [servera] => (item={'key': 1, 'value': 'aaa'}) => {
    "msg": "this is the 1 vars aaa"
}
ok: [servera] => (item={'key': 2, 'value': 'bbb'}) => {
    "msg": "this is the 2 vars bbb"
}

通过循环读取register变量

获取循环的register

vars:
    value_name:
      - aaa
      - bbb
  tasks:
    - name: 1) register loop
      debug:
        msg: "echo this vaule is {{ item }}"
      loop:
        "{{ value_name }}"    
      register: loop_reg

    - name: 2) debug register loop
      debug:
        var: " {{ loop_reg }}" 

输出查看:

ok: [servera] => {
    " {'results': [{'msg': 'echo this vaule is aaa', 'failed': False, 'changed': False, 'item': 'aaa', 'ansible_loop_var': 'item'}, {'msg': 'echo this vaule is bbb', 'failed': False, 'changed': False, 'item': 'bbb', 'ansible_loop_var': 'item'}], 'msg': 'All items completed', 'changed': False}": {
        "changed": false,
        "msg": "All items completed",
        "results": [
            {
                "ansible_loop_var": "item",
                "changed": false,
                "failed": false,
                "item": "aaa",
                "msg": "echo this vaule is aaa"
            },
            {
                "ansible_loop_var": "item",
                "changed": false,
                "failed": false,
                "item": "bbb",
                "msg": "echo this vaule is bbb"
            }
        ]
    }
}

当前一个task为循环时,可以通过循环读取register变量中的结果,返回每一个item对应的register结果

vars:
    value_name:
      - aaa
      - bbb
  tasks:
    - name: 1) register loop
      shell: "echo this vaule is {{ item }}"
      loop:
        "{{ value_name }}"
      register: loop_reg

    - name: 2) debug register loop
      debug:
        msg: " this is  {{ item.stdout }}"
      loop:
        "{{ loop_reg['results'] }}"

运行结果:


TASK [1) register loop] **************************************************************************************************************
changed: [servera] => (item=aaa)
changed: [servera] => (item=bbb)

TASK [2) debug register loop] ********************************************************************************************************
ok: [servera] => (item={'cmd': 'echo this vaule is aaa', 'stdout': 'this vaule is aaa', 'stderr': '', 'rc': 0, 'start': '2021-03-22 13:54:21.761807', 'end': '2021-03-22 13:54:21.764719', 'delta': '0:00:00.002912', 'changed': True, 'invocation': {'module_args': {'_raw_params': 'echo this vaule is aaa', '_uses_shell': True, 'warn': True, 'stdin_add_newline': True, 'strip_empty_ends': True, 'argv': None, 'chdir': None, 'executable': None, 'creates': None, 'removes': None, 'stdin': None}}, 'stdout_lines': ['this vaule is aaa'], 'stderr_lines': [], 'failed': False, 'item': 'aaa', 'ansible_loop_var': 'item'}) => {
    "msg": " this is  this vaule is aaa"
}
ok: [servera] => (item={'cmd': 'echo this vaule is bbb', 'stdout': 'this vaule is bbb', 'stderr': '', 'rc': 0, 'start': '2021-03-22 13:54:22.101426', 'end': '2021-03-22 13:54:22.104848', 'delta': '0:00:00.003422', 'changed': True, 'invocation': {'module_args': {'_raw_params': 'echo this vaule is bbb', '_uses_shell': True, 'warn': True, 'stdin_add_newline': True, 'strip_empty_ends': True, 'argv': None, 'chdir': None, 'executable': None, 'creates': None, 'removes': None, 'stdin': None}}, 'stdout_lines': ['this vaule is bbb'], 'stderr_lines': [], 'failed': False, 'item': 'bbb', 'ansible_loop_var': 'item'}) => {
    "msg": " this is  this vaule is bbb"
}

when条件控制

使用介绍

when用到tasks中,当when后面的条件为真时,执行这个task;为假时,则跳过

简单测试

---
- name:
  hosts: servera
  vars:
    my_service: httpd

  tasks:
    - name: "{{ my_service }}  pkg is installd"
      debug:
        msg: "this is debug {{ my_service }}"
      when: my_service is defined

运行结果:

ok: [servera] => {
    "msg": "this is debug httpd"
}

循环、条件控制综合练习

1:安装软件并运行

编写playbook,在目标主机安装mariadb和python,并运行

---
- name: check mariadb server is running
  hosts: database_dev
  vars:
    mariadb_packages:
      - mariadb-server
      - python3-PyMySQL

  tasks:
    - name: installed
      yum:
        name: "{{ item }}"
        state: present
      loop: "{{ mariadb_packages }}"


    - name: start mariadb service
      service:
        name: mariadb
        state: started
        enabled: true

运行结果:

TASK [installed] *********************************************************************************************************************
changed: [servera.lab.example.com] => (item=mariadb-server)
changed: [servera.lab.example.com] => (item=python3-PyMySQL)

TASK [start mariadb service] *********************************************************************************************************
changed: [servera.lab.example.com]

2:使用when判断

当目标主机位redhat系统时,才安装
修改主机组为prod,首先使用adhoc查看目标主机的操作系统

[student@workstation control-flow]$ ansible database_prod -a 'cat /etc/redhat-release' -u devops --become
serverb.lab.example.com | CHANGED | rc=0 >>
Red Hat Enterprise Linux release 8.0 (Ootpa)

修改playbook,在loop后加when条件判断

 	  loop: "{{ mariadb_packages }}"
      when: ansible_distribution == "RedHat"

执行playbook,查看执行结果

TASK [installed] *********************************************************************************************************************
changed: [serverb.lab.example.com] => (item=mariadb-server)
changed: [serverb.lab.example.com] => (item=python3-PyMySQL)

TASK [start mariadb service] *********************************************************************************************************
changed: [serverb.lab.example.com]

扩展练习

随意修改when的条件,不满足时会提示skipping

TASK [installed] *********************************************************************************************************************
skipping: [serverb.lab.example.com] => (item=mariadb-server) 
skipping: [serverb.lab.example.com] => (item=python3-PyMySQL) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值