Double loop in ansible



我正在尝试使用双循环,以便为检测到的磁盘创建一个LVM,然后将创建的LVM挂载到特定路径。

到目前为止,我可以使用with_items来创建LVM,但我无法找到一种方法来自动创建具有特定"应用程序"的LVM;变量>= 3个磁盘

PS:application用于lv/vg的名称和路径

示例:for sda, sdb, sdc

  • sda:将被跳过,因为它已经从模板
  • 分区
  • sdb:我将使用postgres ==>vg-postgres,lv-postgres,/opt/postgres
  • sdc:我将使用data ===>vg-data,lv-data,/ul>这是怎么做到的?

    main.yml

    ---
    - name: get a list of block devices (excludes loop and child devices)
    command: lsblk -n -o NAME --nodeps --exclude 7
    register: lsblk_out
    
    - include_tasks: lvm.yml
    with_items: '{{ lsblk_out.stdout_lines }}'
    when: sdx != 'sda'
    loop_control:
    loop_var: sdx
    

    lvm.yml

    ---
    - name: task for creating volume group with disk {{ sdx }}
    lvg:
    vg: vg-{{application}}
    pvs: /dev/{{ sdx }}
    pesize: 16
    state: present
    
    - name: task for creating logical volume
    lvol:
    vg: vg-{{application}}
    lv:  lv-{{application}}
    size: 100%FREE
    force: yes
    state: present
    - name: Create a ext4 filesystem on lvm "/dev/{{ sdx }}".
    filesystem:
    fstype: ext4
    dev: "/dev/vg-{{application}}/lv-{{application}}"
    force: no
    - name: Create a directory to mount the filesystem.
    file:
    path: "/opt/{{application}}"
    state: directory
    mode: '0755'
    - name: Mount the created  filesystem.
    mount:
    path: "/opt/{{application}}"
    src: "/dev/vg-{{application}}/lv-{{application}}"
    fstype: ext4
    opts: defaults
    state: mounted
    

有很多解决方案,您可以使用字典:

- include_tasks: lvm.yml
with_items: '{{ lsblk_out.stdout_lines }}'
when: sdx != 'sda'
loop_control:
loop_var: sdx
vars:
listsdx:
sdb: item1
sdc: item2
application: "{{  listsdx[sdx] }}"

如果你想使用这样的列表SDB = item1, SDC = item2,我取每个SDX的最后一个字符,并考虑'a' =0, 'b' = 1,等等

我需要为python函数ord创建自定义过滤器,该函数将字符转换为codeascii:

自定义过滤器:创建一个与剧本相同级别的folder filter_plugins,创建一个文件customfilter.py,我将过滤器命名为ord

文件customfilters.py

#!/usr/bin/python
class FilterModule(object):
def filters(self):
return {
'ord': self.ord
}
def ord(self, c):
return ord(c) - ord('a')

剧本:

- include_tasks: lvm.yml
with_items: '{{ lsblk_out.stdout_lines }}'
when: sdx != 'sda'
loop_control:
loop_var: sdx
vars:
apps: ["", 'item1', 'item2']
application: "{{  apps[sdx | last | ord] }}"

最新更新