当前位置: 代码迷 >> 综合 >> ansible-playbook接收对象数组参数并实现对多个task整体循环
  详细解决方案

ansible-playbook接收对象数组参数并实现对多个task整体循环

热度:50   发布时间:2023-11-27 00:53:39.0

目录

    • 缘起
    • 原理
    • `include_tasks`可以使用`include_role`代替,完美!
    • 相关文件
      • 目录结构
      • hosts
      • main.yml
      • tasks.yml
      • param.json
    • 执行
      • 命令
      • 输出

缘起

业务需要在ansible中进行循环操作,但是由于原playbook中tasks之间有顺序关系,所以希望可以将多个task整体循环,但是网上找到的大部分playbook循环案例都是针对单个task循环。
一开始的思路是循环role,但是无法生效,机缘巧合看到了include_tasks,测试之后发现可以满足需求,特此记录一下。

原理

通过include_taskswith_itemstasks.yml文件内的所有task进行整体循环,而不是在每个task上写with_items

注:虽然我认为用roles更优雅,但经测试roles无法支持with_items,也无法将{ { item.* }}透传到role内部。如果有大佬知道相关写法欢迎交流~

include_tasks可以使用include_role代替,完美!


相关文件

目录结构

在这里插入图片描述

hosts

192.168.111.11 ansible_ssh_port=[port] ansible_ssh_user=[username] ansible_ssh_pass=[password]

main.yml

---- hosts: allgather_facts: novars:diskParamList:- disk: /dev/sdbdiskfullpath: /dev/sdb1fstype: ext4mountDir: /datatasks:- include_tasks: tasks.ymlwith_items: "{
    { diskParamList }}"

tasks.yml

---- name: tasksblock:- name: hahadebug:msg: "{
    { item.fstype }} {
    { item.diskfullpath }} {
    { item.mountDir }}"- name: heiheidebug:msg: "{
    { item.disk }} - 11"

param.json

{
    "diskParamList":[{
    "disk":"1","diskfullpath":"1","fstype":"1","mountDir":"1"},{
    "disk":"2","diskfullpath":"2","fstype":"2","mountDir":"2"},{
    "disk":"3","diskfullpath":"3","fstype":"3","mountDir":"3"}]
}

执行

命令

ansible-playbook -i hosts main.yml -e "@param.json"

输出

在这里插入图片描述
可以看到输出中循环是以tasks文件中的一组task(而不是单个task)为单位循环的。

  相关解决方案