我正在尝试使用双循环,以便为检测到的磁盘创建一个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] }}"