自动化运维-ansible中的循环应用

发布于:2025-09-04 ⋅ 阅读:(13) ⋅ 点赞:(0)

自动化运维-ansible中的循环与过滤器的应用

一、循环的使用示例

  1. with_items 迭代列表

    [student@master ansible] vim a.yml
    # playbook内容如下
    ---
    - name: test1
      hosts: node1
      tasks:
        - name: test11
          shell:
            cmd: echo "{{ item }}"
          with_items:
            - user1
            - user2
            - user3
          register: xx
    
        - name: test12
          debug:
            var: xx.results[0].stdout
    
        - name: test13
          debug:
            var: xx.results[1].stdout
    
        - name: test14
          debug:
            var: xx.results[2].stdout
    

    在这里插入图片描述

  2. with_dict 迭代字典

    [student@master ansible] vim b.yml
    # playbook内容如下
    ---
    - name: test2
      hosts: node1
      tasks:
        - name: test21
          debug:
            msg: "{{item.key}}&{{item.value}}"
          with_dict:
            address: 1
            netmask: 2
            gateway: 3
    

    在这里插入图片描述

  3. with_fileglob 迭代文件

    [student@master ansible] vim c.yml
    # playbook内容如下
    ---
    - name: test3
      hosts: node1
      tasks:
        - name: test31
          debug:
            msg: "{{item}}"
          with_fileglob:
            - /home/student/ansible/*.yml
    

    在这里插入图片描述

  4. with_lines 迭代行

    [student@master ansible] vim d.yml
    # playbook内容如下
    ---
    - name: test4
      hosts: node1
      tasks:
        - name: test41
          debug:
            msg: "{{item}}"
          with_lines:
            - find /home/student/ansible -name "*.yml"
    

    在这里插入图片描述

  5. with_nested 嵌套迭代

    [student@master ansible] vim e.yml
    # playbook内容如下
    ---
    - name: test5
      hosts: node1
      tasks:
        - name: test51
          debug:
            msg:"{{item[0]}}&{{item[1]}}"
          with_nested:
            - [a,b]
            - [1,2,3]
    

    在这里插入图片描述

  6. with_sequence 排序列

    start 是从什么开始 end 是结束 stride 是每隔多少

    [student@master ansible] vim f.yml
    # playbook内容如下
    ---
    - name: test
      hosts: node1
      tasks:
        - name: test61
          debug:
            msg: "{{item}}"
          with_sequence:
            start=5
            end=15
            stride=3
    

    在这里插入图片描述

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

    [student@master ansible] vim g.yml
    # playbook内容如下
    ---
    - name: test7
      hosts: node1
      tasks:
        - name: test71
          debug:
            msg: "{{item}}"
          with_random_choice:
            - 1
            - 2
            - 3
            - a
            - b
            - c
    

    在这里插入图片描述

二、过滤器

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


因为格式原因,在这里使用 I 代替 | 符号,使用时请更改为 |

  1. 常用字符串有关的过滤器

    过滤器名 功能描述 示例用法 示例结果/说明
    upper 将字符串转换成纯大写 {{ 'abc123ABC' I upper }} ‘ABC123ABC’
    lower 将字符串转换成纯小写 {{ 'abc123ABC' I lower }} ‘abc123abc’
    capitalize 将字符串首字母大写,之后的所有字母纯小写 {{ 'hello WORLD' I capitalize }} ‘Hello world’
    trim 将字符串开头和结尾的空格去除 {{ ' abc ' I trim }} ‘abc’
    length/count 返回字符串长度 {{ 'hello' I length }} 5
    first 返回字符串的第一个字符 {{ 'hello' I first }} ‘h’
    last 返回字符串的最后一个字符 {{ 'hello' I last }} ‘o’
    center 将字符串放在中间,并且设置指定宽度,字符串两边用空格补齐 {{ 'hi' I center(width=10) }} ’ hi ’
    list 将字符串转换成列表,每个字符作为一个元素 {{ 'hello' I list }} [‘h’,‘e’,‘l’,‘l’,‘o’]
    shuffle 将字符串转换成列表,每个字符作为一个元素,并且随机打乱顺序 {{ 'hello' I shuffle }} 随机顺序,如 [‘o’,‘l’,‘e’,‘h’,‘l’]
  2. 和数字操作有关的过滤器

    过滤器名 功能描述 示例用法 示例结果/说明
    int 将对应的值转换成int类型 {{ '8' I int }} 8
    int 将对应的值转换成int类型,如果无法转换,默认返回指定值 {{ 'a' I int(default=6) }} 6
    float 将对应的值转换成浮点型 {{ '8.5' I float }} 8.5
    float 当对应的值无法被转换成浮点型时,则返回指定值 {{ 'a' I float(8.88) }} 8.88
    abs 获取对应数值的绝对值 {{ -5 I abs }} 5
    round 四舍五入 {{ 12.5 I round }} 13
    round 取指定小数位数 {{ 3.1415926 I round(5) }} 3.14159
    random 从0到指定值中随机返回一个随机数 {{ 100 I random }} 0-100间的随机整数
    random 从指定起始值到指定值中随机返回一个随机数 {{ 10 I random(start=5) }} 5-10间的随机整数
    random 从指定起始值到指定值中随机返回一个随机数,按指定步长 {{ 15 I random(start=5,step=3) }} 5,8,11,14中的一个
    random 从0到指定值中随机返回一个随机数,按指定步长 {{ 15 I random(step=5) }} 0,5,10,15中的一个
  3. 文件或目录类过滤器

    过滤器名 功能描述 示例用法 示例结果/说明
    hash 使用指定算法对字符串进行哈希 {{ '123456' I hash('sha1') }} SHA1哈希字符串
    hash 使用md5算法对字符串进行哈希 {{ '123456' I hash('md5') }} MD5哈希字符串
    checksum 获取字符串的校验和(与md5哈希值一致) {{ '123456' I checksum }} MD5哈希字符串
    password_hash 使用加密算法对字符串进行哈希,生成随机"盐" {{ '123456' I password_hash('sha256') }} 带随机盐的SHA256哈希
    password_hash 使用加密算法对字符串进行哈希,使用指定的"盐" {{ '123456' I password_hash('sha256','mysalt') }} 带指定盐的SHA256哈希
    password_hash 使用sha512算法对字符串进行哈希,生成随机"盐" {{ '123123' I password_hash('sha512') }} 带随机盐的SHA512哈希
    password_hash 使用sha512算法对字符串进行哈希,使用指定的"盐" {{ '123123' I password_hash('sha512','ebzL.U5cjaHe55KK') }} 带指定盐的SHA512哈希

三、for 循环示例

  1. 要求

    从 http://ansible.example.com/materials/newhosts.j2 下载模板文件
    完成该模板文件,用来生成新主机清单(主机的显示顺序没有要求),结构如下:
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.122.10 node1.example.com node1
    192.168.122.20 node2.example.com node2
    192.168.122.30 node3.example.com node3
    192.168.122.40 node4.example.com node4
    192.168.122.50 node5.example.com node5
    创建剧本/home/student/ansible/newhosts.yml,它将使用上述模板在 node1 主机上
    生成文件/etc/newhosts。

  2. 步骤

    下载模板

    [student@master ansible] ansible-playbook newhosts.yml
    

    在这里插入图片描述

    编辑 newhosts.j2 文件,写入 for 循环

    [student@master ansible] vim newhosts.j2
    # 编辑内容如下
    {% for yy in groups.all %}
    {{ hostvars[yy].ansible_default_ipv4.address }} {{ hostvars[yy].ansible_fqdn }} [{ hostvars[yy].ansible_hostname }]
    {% endfor %}
    

    在这里插入图片描述

    编辑 playbook,newhosts.yml

    [student@master ansible] vim newhosts.yml
    # playbook内容如下
    ---
    - name: get fact
      hosts: all
    - name: cp file
      hosts: node1
      tasks:
        - name: cp file1
          template:
            src: /home/student/ansible/newhosts.j2
            dest: /etc/newhosts
    

    在这里插入图片描述

    查看 node1 的 /etc/newhosts 文件

    [student@master ansible] ansible node1 -m shell -a 'cat /etc/newhosts'
    

    在这里插入图片描述


网站公告

今日签到

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