zoukankan      html  css  js  c++  java
  • 2. ansible-playbook 条件语句-内部变量使用

    内部变量指的是把变量定义在playbook里面或者是执行结果作为变量

    循环语句-标准Loops

    [root@LeoDevops playb]# cat p_loop.yaml 
    - hosts: u12
      gather_facts: False
      tasks:
        - name: debug loops
          debug: msg="name -------> {{ item  }}"
          with_items:
              - one
              - two
    

    运行结果如下:

    [root@LeoDevops playb]# ansible-playbook p_loop.yaml 
    
    PLAY [u12] ************************************************************************************************************************************************************************************
    
    TASK [debug loops] ****************************************************************************************************************************************************************************
    ok: [192.168.93.137] => (item=one) => {
        "changed": false, 
        "item": "one", 
        "msg": "name -------> one"
    }
    ok: [192.168.93.137] => (item=two) => {
        "changed": false, 
        "item": "two", 
        "msg": "name -------> two"
    }
    
    PLAY RECAP ************************************************************************************************************************************************************************************
    192.168.93.137             : ok=1    changed=0    unreachable=0    failed=0   
    

    当然也支持字典格式的数据对于要循环的内容

    [root@LeoDevops playb]# cat  p_loop.yaml 
    - hosts: u12
      gather_facts: False
      tasks:
        - name: debug loops
          debug: msg="key--> {{ item.key  }} value ---> {{ item.value  }}"
          with_items:
              - {"key":"name","value":"one"}
              - {"key":"name","value":"two"}
              - {"key":"name","value":"three"}
              - {"key":"name","value":"four"}
    

    嵌套循环loop

    [root@LeoDevops playb]# cat p_iframe_loop.yaml 
    - hosts: u12
      gather_facts: False
      tasks:
        - name: debug loops
          debug: msg="name --> {{ item[0] }} value ---> {{ item[1] }}"
          with_nested:
            - [1]
            - ['a','b','c']
    

    执行效果如下:

    [root@LeoDevops playb]# ansible-playbook p_iframe_loop.yaml 
    
    PLAY [u12] ************************************************************************************************************************************************************************************
    
    TASK [debug loops] ****************************************************************************************************************************************************************************
    ok: [192.168.93.137] => (item=[1, u'a']) => {
        "changed": false, 
        "item": [
            1, 
            "a"
        ], 
        "msg": "name --> 1 value ---> a"
    }
    ok: [192.168.93.137] => (item=[1, u'b']) => {
        "changed": false, 
        "item": [
            1, 
            "b"
        ], 
        "msg": "name --> 1 value ---> b"
    }
    ok: [192.168.93.137] => (item=[1, u'c']) => {
        "changed": false, 
        "item": [
            1, 
            "c"
        ], 
        "msg": "name --> 1 value ---> c"
    }
    
    PLAY RECAP ************************************************************************************************************************************************************************************
    192.168.93.137             : ok=1    changed=0    unreachable=0    failed=0 
    

    散列loops

    散列loops比标准的loops就是变量支持更丰富的数据结构,比如标准的loops的最外层数据必须是Python 的List数据类型,而散列loops直接支持YAML格式的数据变量。例如下面的简单例子:

    [root@LeoDevops playb]# cat p-sanlieloop.yaml 
    - hosts: u12
      gather_facts: False
      vars:
        users: 
              yq:
                name: yq
                shell: bash
              ljf:
                name: ljf
                shell: bash
      tasks:
        - name: test for sanlie loop
          debug: msg="name --> {{ item.key }} value --> {{ item.value.name }} shell ---> {{ item.value.shell }}"
          with_dict:  users
    
    

    文件匹配loops

    针对一个目录下制定格式的文件进行处理,这个时候直接使用with_fileglob循环去匹配我们需要处理的文件即可。

    [root@LeoDevops playb]# cat  p-fileloop.yaml 
    - hosts: u12
      gather_facts: False
      tasks:
        - name: debug file loop
          debug: msg="files ---> {{ item }}"
          with_fileglob:
            - /tmp/playb/*.yaml
    

    随机选择loops

    随机数

    [root@LeoDevops playb]# cat p-randomloop.yaml 
    - hosts: u12
      gather_facts: False
      tasks:
        - name: debug loops
          debug: msg="name -->> {{ item }}"
          with_random_choice:
            - "a1"
            - "a2"
            - "a3"
            - "a4"
    

    条件判断loops

    有时候task执行一个task后,我们需要检测这个task的结果是否达到了预想状态,如果没有达到我们预想的状态,那么就需要退出整个playbook执行,那么这个时候我们就需要对某个task结果一直循环检测了。

    [root@LeoDevops playb]# cat p-conditionloop.yaml 
    - hosts: u12
      tasks:
        - name: debug loop
          shell: hostname
          register: pwd
          until: pwd.stdout.startswith("LeoTestMachine")  # stdout与stdout_lines是不一样的,这个要注意哦
          retries: 3   # 重复3次
          delay: 2  # 间隔2秒
    

    文件优先匹配

    [root@LeoDevops playb]# cat p-filefilter.yaml 
    - hosts: u12
      gather_facts: True
      tasks:
        - name: debug codes
          debug: msg="files --->{{ item }}"
          with_first_found:
            - "{{ ansible_distribution }}.yaml"
            - "default.yaml"
    

    register Loops

    register不但用于task直接互相传递数据,也可以吧register用在单一的task中进行变量临时存储,并且可以接受多个task结果当做变量临时存储。

    [root@LeoDevops playb]# cat register_loops.yaml
    - hosts: u12
      gather_facts: True
      tasks:  
        - name: debug loops
          shell: "{{ item }}"
          with_items:
              - hostname
              - uname
          register: ret
        - name: display loops
          debug: msg="{% for i in ret.results  %}--->{{ i.stdout  }}{% endfor  %}"
    

    执行多个task并且register给一个变量时,它的数据就和平常的不一样了,就需要使用jinja2语法显示出来

  • 相关阅读:
    MVC中单用户登录
    用CheckBox做删除时请不要使用@Html.CheckBoxFor
    MVC3"不允许启动新事务,因为有其他线程正在该会话中运行"错误解决方法
    下拉菜单DropDwon实现方法
    MVC3中Ajax.ActionLink用法
    删除时显示确认对话框
    民航指令学习(一)
    CentOS常用命令
    CentOS手动分区步骤
    CentOS下安装JDK和Tomcat
  • 原文地址:https://www.cnblogs.com/liaojiafa/p/9353766.html
Copyright © 2011-2022 走看看