【问题标题】:Ansible looping list of shell commands and passing variables to the command?Ansible循环shell命令列表并将变量传递给命令?
【发布时间】:2019-07-26 22:12:07
【问题描述】:

我试图弄清楚如何循环 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}}

访问

【问题讨论】:

    标签: loops ansible


    【解决方案1】:
        - shell: "{{ item }}"
          loop:
            - "AAA {{ item.1.name }} {{ item.1.device }}"
            - "BBB {{ item.1.name }} {{ item.1.device }}"
          with_subelements:
             - "{{ targets }}"
             - disks
    

    问:是否支持这种方法?

    答:不可以。不可能将 2 个loops 放入一项任务中。

    相反,可以使用命令创建文件

    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
    

    和迭代(循环)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"
    

    【讨论】:

    • 最后一个问题我如何将targets.www或任何外部变量传递到commands.yml????我尝试在您的剧本中使用 vars,它似乎可以工作.. 但在我正在工作的那个中做了完全相同的事情,一个不断收到违规行错误消息......
    • 变量的scope 是戏。剧中声明的变量将在包含的任务中可用。打开新问题并在需要时将其设为mcve
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2012-04-24
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多