loops - Ansible循环shell命令列表并将变量传递给命令?
问题描述
我试图弄清楚如何循环 shell 命令,但命令包含变量。我使用此链接作为参考https://github.com/VerosK/ansible-iscsi-target/blob/master/tasks/implementations/lio.yml
代码是遍历每个磁盘的命令列表。
这是很长的工作代码:::
---
-
become: true
gather_facts: false
hosts: isci_ansible_centos01
vars:
iscsi_target_base: iqn.2017-11.local.centos7
iscsi_targets:
- wwn: iqn.2019-8.local.centos7
disks:
- name: 'iscsidisk1'
device: '/dev/sdb'
vgname: 'vg.iscsi1'
lvname: 'lv.iscsi1'
mode: 'block'
- name: iscsidisk2
device: /dev/sdc
vgname: vg.iscsi2
lvname: lv.iscsi2
mode: block
tasks:
#targetcli '/backstores/block' create scsids1 /dev/vg-iscsi/lv-iscsi
- name: Create backstore
shell: targetcli '/backstores/{{ item.1.mode }}' create {{ item.1.name }} /dev/{{ item.1.vgname }}/{{ item.1.lvname }}
with_subelements:
- "{{ iscsi_targets }}"
- disks
ignore_errors: yes
#targetcli '/iscsi' create iqn.2017-11.local.centos7:disk1
- name: Create target
shell: targetcli '/iscsi' create {{ iscsi_target_base }}:{{item.1.name}}
with_subelements:
- "{{ iscsi_targets }}"
- disks
ignore_errors: yes
# targetcli '/iscsi/iqn.2017-11.local.centos7:disk1/tpg1/acls' create iqn.2017-11.local.centos7:node1
- name: Create nodes
shell: targetcli '/iscsi/{{ iscsi_target_base }}:{{item.1.name}}/tpg1/acls' create {{ iscsi_target_base }}:node{{item.1.name}}
with_subelements:
- "{{ iscsi_targets }}"
- disks
# targetcli '/iscsi/iqn.2017-11.local.centos7:disk1/tpg1' set attribute authentication=0 demo_mode_write_protect=0
- name: Set Authentication
shell: targetcli '/iscsi/{{ iscsi_target_base }}:{{item.1.name}}/tpg1' set attribute authentication=0 demo_mode_write_protect=0
with_subelements:
- "{{ iscsi_targets }}"
- disks
# targetcli '/iscsi/iqn.2017-11.local.centos7:disk1/tpg1' set attribute generate_node_acls=1
- name: Set geenerate_node_acls
shell: targetcli '/iscsi/{{ iscsi_target_base }}:{{item.1.name}}/tpg1' set attribute generate_node_acls=1
with_subelements:
- "{{ iscsi_targets }}"
- disks
# targetcli '/iscsi/iqn.2017-11.local.centos7:disk1/tpg1/luns' create /backstores/block/scsids
- name: Create backing_store
shell: targetcli '/iscsi/{{ iscsi_target_base }}:{{item.1.name}}/tpg1/luns' create /backstores/block/{{ item.1.name }}
with_subelements:
- "{{ iscsi_targets }}"
- disks
这是我想要做的就是将其转换为::: 但我认为变量 item 变得混乱。支持这个方法???我只是想知道以供将来参考。
- name: Configure ISCSI using SHELL LOOP
shell: {{ item }}
loop:
- targetcli '/backstores/{{ item.1.mode }}' create {{ item.1.name }} /dev/{{ item.1.vgname }}/{{ item.1.lvname }}
- targetcli '/iscsi' create {{ iscsi_target_base }}:{{item.1.name}}
- targetcli '/iscsi/{{ iscsi_target_base }}:{{item.1.name}}/tpg1/acls' create {{ iscsi_target_base }}:node{{item.1.name}}
- targetcli '/iscsi/{{ iscsi_target_base }}:{{item.1.name}}/tpg1' set attribute authentication=0 demo_mode_write_protect=0
- targetcli '/iscsi/{{ iscsi_target_base }}:{{item.1.name}}/tpg1' set attribute generate_node_acls=1
- targetcli '/iscsi/{{ iscsi_target_base }}:{{item.1.name}}/tpg1/luns' create /backstores/block/{{ item.1.name }}
with_subelements:
- "{{ iscsi_targets }}"
- disks
顺便说一句,我必须使用 with_subelements 来访问 iscsi_targets 中的项目。出于某种原因,它不允许我使用 with_items 并使用 {{item.device}} 访问
解决方案
- shell: "{{ item }}"
loop:
- "AAA {{ item.1.name }} {{ item.1.device }}"
- "BBB {{ item.1.name }} {{ item.1.device }}"
with_subelements:
- "{{ targets }}"
- disks
问:“这个方法支持吗? ”
答:不可以。不可能将 2 个循环放入一项任务中。
相反,可以使用命令创建文件
shell> cat commands.yml
- debug:
msg: "{{ cmd_item }}"
loop:
- "AAA {{ item.1.name }} {{ item.1.device }}"
- "BBB {{ item.1.name }} {{ item.1.device }}"
loop_control:
loop_var: cmd_item
和 iterate(loop) include_tasks。下面的戏
- hosts: localhost
vars:
targets:
- wwn: 2019.centos7
disks:
- name: 'disk1'
device: '/dev/sdb'
- name: 'disk2'
device: '/dev/sdc'
tasks:
- include_tasks: commands.yml
loop: "{{ targets|subelements('disks') }}"
给
"msg": "AAA disk1 /dev/sdb"
"msg": "BBB disk1 /dev/sdb"
"msg": "AAA disk2 /dev/sdc"
"msg": "BBB disk2 /dev/sdc"
推荐阅读
- ruby-on-rails - 检查子记录是否会命中 Rails 中的数据库
- azure - 在运行 terraform init 之前制作 Azure 存储帐户和容器?
- sql - 将多列与postgresql中的单个值进行比较
- html - 如果一个框高于其他框,如何使用显示 flex 换行并删除空格
- c++ - 多态对象数组
- java - 在 Jmeter 中,如何等待前一个采样器(JDBC 请求)完成然后启动新的采样器请求(Http 请求)
- java - Android 工作室:com.google.android.gms.internal.zzbgl 未找到
- amazon-web-services - 使用 localstack 运行 lambda 函数
- python - 熊猫替换多个值
- android - 如何使用生成的保管箱访问令牌将我的保管箱文件连接到我在 android studio 中的保管箱控制台应用程序