jimlu

V1

2023/04/27阅读:22主题:默认主题

ansible循环之with_item

ansible循环值with_items

案例:批量创建多个目录,写下面我们使用了3次file模块进行了实现

---
- hosts: localhost
  remote_user: admin
  gather_facts: no
  tasks:
  - name: create directory a1
    file:
      path: /home/admin/jin/test/a1
      state: directory
  - name: create directory a2
    file:
      path: /home/admin/jin/test/a2
      state: directory
  - name: create directory a3
    file:
      path: /home/admin/jin/test/a3
      state: directory

[admin@jfedu01 jin]$ tree test
test
├── a1
├── a2
└── a3

下面通过with_item进行优化

方案1:将创建路径罗列在with_items:

---
- hosts: localhost
  remote_user: admin
  gather_facts: no
  tasks:
  - name: create directory
    file:
      path: "{{item}}"
      state: directory
    with_items:
      - /home/admin/jin/test/a1
      - /home/admin/jin/test/a2
      - /home/admin/jin/test/a3

方案2:将不变的写在path路径上,变化的通过with_items遍历

---
- hosts: localhost
  remote_user: admin
  gather_facts: no
  tasks:
  - name: create directory
    file:
      path: /home/admin/jin/test/{{item}}
      state: directory
    with_items: [a1,a2,a3]  #这里使用中括号[]或者大括号{}都行

方案3:定义一个a变量存储值,然后通过with_items遍历

---
- hosts: localhost
  remote_user: admin
  gather_facts: no
  vars:
    a:
      - a1
      - a2
      - a3
  tasks:
  - name: create directory
    file:
      path: /home/admin/jin/test/{{item}}
      state: directory
    with_items: "{{a}}"

方案4:a变量的另一种写法,效果和上面一样

---
- hosts: localhost
  remote_user: admin
  gather_facts: no
  vars:
    a: {a1,a2,a3}
  tasks:
  - name: create directory
    file:
      path: /home/admin/jin/test/{{item}}
      state: directory
    with_items: "{{a}}"

方案5:将固定的路径和变化的目录名都定义成变量

---
- hosts: localhost
  remote_user: admin
  gather_facts: no
  vars:
    p: /home/admin/jin/test/
    a: {a1,a2,a3}
  tasks:
  - name: create directory
    file:
      path: "{{p}}{{item}}"
      state: directory
    with_items: "{{a}}"

实战:查看test目录下的文件名,并在test1目录创建和test目录文件名一样的文件

思路:

  • 通过shell模块运行ls命令查看test目录下的文件
  • 通过register,定义一个变量名为results的变量,接收shell模块运行的结果
  • 通过file模块创建文件,{{item}}变量用来循环接收值
  • 通过with_items ,变量输出results.stdout_lines的值
---
- hosts: localhost
  remote_user: admin
  gather_facts: no
  tasks:
  - name: display file in test directory
    shell: ls /home/admin/jin/test
    register: results

  - name: create files
    file:
      path: /home/admin/jin/test1/{{item}}
      state: touch
 # - debug:
 #     var: results
    with_items: "{{results.stdout_lines}}"

分类:

后端

标签:

后端

作者介绍

jimlu
V1