2. ansible-playbook 条件语句-内部变量使用

Posted liaojiafa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2. ansible-playbook 条件语句-内部变量使用相关的知识,希望对你有一定的参考价值。

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

循环语句-标准Loops

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

运行结果如下:

[[email protected] 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   

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

[[email protected] 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

[[email protected] 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‘]

执行效果如下:

[[email protected] 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格式的数据变量。例如下面的简单例子:

[[email protected] 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循环去匹配我们需要处理的文件即可。

[[email protected] 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

随机数

[[email protected] 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结果一直循环检测了。

[[email protected] 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秒

文件优先匹配

[[email protected] 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结果当做变量临时存储。

[[email protected] 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语法显示出来

以上是关于2. ansible-playbook 条件语句-内部变量使用的主要内容,如果未能解决你的问题,请参考以下文章

ansible-playbook

ansible-playbook之条件判断

ansible-playbook之block

Ansible-playbook 剧本编写

Ansible-playbook 剧本编写

ansible-playbook模板化(jinja2)