ansible循环

发布于:2025-09-03 ⋅ 阅读:(22) ⋅ 点赞:(0)

ansible循环

with_items:(迭代列表)最基础的列表遍历,支持简单列表或嵌套列表(会自动展开),通过item访问元素

示例:

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  tasks:
    - name: 1
      debug:
        msg: echo {{ item }}
      with_items:
        - 123
        - 234
        - 345
~  
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => (item=123) => {
    "msg": "echo 123"
}
ok: [node1] => (item=234) => {
    "msg": "echo 234"
}
ok: [node1] => (item=345) => {
    "msg": "echo 345"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

with_dict:(迭代字典)遍历字典结构,用item.keyitem.value分别访问键和值

示例:

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  tasks:
    - name: debug
      debug:
        msg: "{item.key }} & {{item.value}}"
      with_dict:
        address: 1
        network: 2
        gateway: 3
~ 
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => (item={'key': 'address', 'value': 1}) => {
    "msg": "{item.key }} & 1"
}
ok: [node1] => (item={'key': 'network', 'value': 2}) => {
    "msg": "{item.key }} & 2"
}
ok: [node1] => (item={'key': 'gateway', 'value': 3}) => {
    "msg": "{item.key }} & 3"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

with_fileglob:(迭代文件)匹配本地文件系统中的文件路径,用于批量处理文件

示例:

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  tasks:
    - name: cp file
      copy:
        src: "{{item}}"
        dest: /tmp/
      with_fileglob:
        - /tmp/*.sh
        - /tmp/*.py
~   
[student@master ansible]$ cd /tmp/
[student@master tmp]$ sudo touch a.sh b.sh c.py d.py
[student@master tmp]$ cd -
/home/student/ansible
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [cp file] *****************************************************************
changed: [node1] => (item=/tmp/a.sh)
changed: [node1] => (item=/tmp/b.sh)
changed: [node1] => (item=/tmp/c.py)
changed: [node1] => (item=/tmp/d.py)

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

with_lines:(迭代行)可以将命令行的输出结果按行迭代

示例:

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  tasks:
    - name: cp file
      copy:
        src: "{{item}}"
        dest: /tmp/
      with_lines:
        - find /home/student/ansible -name "*.yml"
~                                               

with_nested:实现嵌套循环,组合多个列表的元素

示例:

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  tasks:
    - name: debug
      debug:
        msg: "{{item[0]}} & {{item[1]}}"
      with_nested:
        - [a,b]
        - [1,2,3]
~ 
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => (item=['a', 1]) => {
    "msg": "a & 1"
}
ok: [node1] => (item=['a', 2]) => {
    "msg": "a & 2"
}
ok: [node1] => (item=['a', 3]) => {
    "msg": "a & 3"
}
ok: [node1] => (item=['b', 1]) => {
    "msg": "b & 1"
}
ok: [node1] => (item=['b', 2]) => {
    "msg": "b & 2"
}
ok: [node1] => (item=['b', 3]) => {
    "msg": "b & 3"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

with_sequence 排序列(start是从什么开始,end结束 stride每隔多少**)**

示例:

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  tasks:
     - name: debug
       debug:
         msg: "{{item}}"
       with_sequence:
         start=1
         end=5
         stride=1
~
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => (item=1) => {
    "msg": "1"
}
ok: [node1] => (item=2) => {
    "msg": "2"
}
ok: [node1] => (item=3) => {
    "msg": "3"
}
ok: [node1] => (item=4) => {
    "msg": "4"
}
ok: [node1] => (item=5) => {
    "msg": "5"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  tasks:
     - name: debug
       debug:
         msg: "{{item}}"
       with_sequence:
         start=10
         end=5
         stride=-1
~                               
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => (item=10) => {
    "msg": "10"
}
ok: [node1] => (item=9) => {
    "msg": "9"
}
ok: [node1] => (item=8) => {
    "msg": "8"
}
ok: [node1] => (item=7) => {
    "msg": "7"
}
ok: [node1] => (item=6) => {
    "msg": "6"
}
ok: [node1] => (item=5) => {
    "msg": "5"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

with_random_choice 随机获得列表中的一个值

示例:

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  tasks:
     - name: debug
       debug:
         msg: "{{item}}"
       with_random_choice:
         - 1
         - 2
         - 3
         - 4
         - 5
~     
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => (item=1) => {
    "msg": 1
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  tasks:
     - name: debug
       debug:
         msg: echo {{ item }}
       with_items:
         - a
         - b
         - c
         - e
         - f
~                                  
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => (item=a) => {
    "msg": "echo a"
}
ok: [node1] => (item=b) => {
    "msg": "echo b"
}
ok: [node1] => (item=c) => {
    "msg": "echo c"
}
ok: [node1] => (item=e) => {
    "msg": "echo e"
}
ok: [node1] => (item=f) => {
    "msg": "echo f"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  tasks:
     - name: debug
       debug:
         msg: echo {{ item }}
       loop:
         - a
         - b
         - c
         - e
         - f
~ 
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => (item=a) => {
    "msg": "echo a"
}
ok: [node1] => (item=b) => {
    "msg": "echo b"
}
ok: [node1] => (item=c) => {
    "msg": "echo c"
}
ok: [node1] => (item=e) => {
    "msg": "echo e"
}
ok: [node1] => (item=f) => {
    "msg": "echo f"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Loop:

现在loop已经替代了with,更多的是loop配合过滤器进行使用

过滤器:

常用字符串有关的过滤器

示例:(upper将字符串转换成纯大写)

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  vars:
    testvar: "abc123ABC 666"
    testvar1: " abc "
  tasks: 
     - name: debug1
       debug:
         msg: "{{ testvar |upper}}"
~   
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug1] ******************************************************************
ok: [node1] => {
    "msg": "ABC123ABC 666"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

示例:(lower将字符串转换成纯小写)

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  vars:
    testvar: "abc123ABC 666"
    testvar1: " abc "
  tasks:
     - name: debug1
       debug:
         msg: "{{ testvar |lower}}"
~                           
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug1] ******************************************************************
ok: [node1] => {
    "msg": "abc123abc 666"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

示例:(将字符串首字母大写,之后的所有字母纯小写)

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  vars:
    testvar: "abc123ABC 666"
    testvar1: " abc "
  tasks:
     - name: debug1
       debug:
         msg: "{{ testvar |capitalize}}"
~                                    
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug1] ******************************************************************
ok: [node1] => {
    "msg": "Abc123abc 666"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

示例:(trim 将字符串的首尾空格去掉)

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  vars:
    testvar: "abc123ABC 666"
    testvar1: " abc "
  tasks:
     - name: debug1
       debug:
         msg: "{{ testvar1 |trim}}"
~ 
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug1] ******************************************************************
ok: [node1] => {
    "msg": "abc"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

使用加密算法对字符串进行hash加密

创建一个用户shenyifeng,并且设置密码为redhat,密码采用SHA512哈希格式

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  tasks:
     - name: create user
       user:
         name: testuer1
         password: "{{ 'redhat' | password_hash('sha512') }}"
         state: present
~   
[student@master ansible]$ vim pass
pw: redhat
~     
[student@master ansible]$ chmod 600 pass
[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1
  vars_files:
    - /home/student/ansible/pass
  tasks:
    - name: create user
      user:
        name: testuer1
        password: "{{ pw | password_hash('sha512') }}"
        state: present
~                      
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [create user] *************************************************************
changed: [node1]

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

和数字操作有关的过滤器:

[student@master ansible]$ vim s.yml
---
- name: test
  hosts: node1
  tasks:
    - name: 1
      debug:
        msg: "{{ 8+8 }}"
~          
[student@master ansible]$ ansible-playbook s.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => {
    "msg": "16"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

debug:

​ #将对应的值转换成int类型

​ #ansible中,字符串和整形不能直接计算,比如{{ 8+‘8’ }}会报错

​ #所以,我们可以把一个值为数字的字符串转换成整形后再做计算

​ msg: “{{ 8+(‘8’ | int) }}”

示例:

[student@master ansible]$ vim s.yml 
---
- name: test
  hosts: node1
  tasks:
    - name: 1
      debug:
        msg: "{{ 8+('8'|int) }}"
~           
[student@master ansible]$ ansible-playbook s.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => {
    "msg": "16"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

debug:

​ #将对应的值转换成int类型,如果无法转换,默认返回0

​ #使用int(default=6)或者int(6)时,如果无法转换则返回指定值6

​ msg: “{{ ‘a’ | int(default=6) }}”

示例:

[student@master ansible]$ vim s.yml 
---
- name: test
  hosts: node1
  tasks:
    - name: 1
      debug:
        msg: "{{ 8+('a'|int(default=3)) }}"
~                 
[student@master ansible]$ ansible-playbook s.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => {
    "msg": "11"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

debug:

​ #将对应的值转换成浮点型,如果无法转换,默认返回’0.0’

示例:

[student@master ansible]$ vim s.yml
---
- name: test
  hosts: node1
  tasks:
    - name: 1
      debug:
        msg: "{{ 8 | float }}"
~  
[student@master ansible]$ ansible-playbook s.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => {
    "msg": "8.0"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[student@master ansible]$ vim s.yml 
---
- name: test
  hosts: node1
  tasks:
    - name: 1
      debug:
        msg: "{{ 'fds' | float }}"
~        
[student@master ansible]$ ansible-playbook s.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => {
    "msg": "0.0"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[student@master ansible]$ vim s.yml 
---
- name: test
  hosts: node1
  tasks:
    - name: 1
      debug:
        msg: "{{ 'fds' | float(1.23) }}"
~         
[student@master ansible]$ ansible-playbook s.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => {
    "msg": "1.23"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

debug:

​ #从0到100中随机返回一个随机数

示例:

[student@master ansible]$ vim s.yml 
---
- name: test
  hosts: node1
  tasks:
    - name: 1
      debug:
        msg: "{{ 100 | random }}"
~   
[student@master ansible]$ ansible-playbook s.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [debug] *******************************************************************
ok: [node1] => {
    "msg": "92"
}

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


网站公告

今日签到

点亮在社区的每一天
去签到