我有一堆服务器上有四个物理驱动器(/ dev / sda,sdb,sdc和sdd)。 sda上安装了操作系统。
我需要格式化除sda之外的每个驱动器。我需要检查每个驱动器上是否有数据。如果确实如此,那么我就不应该格式化它。
# This will get all physical disks (sda, sdb, sdc, etc) and assign them to disk_var
- name: Get disks
set_fact: disk_var="{{hostvars[inventory_hostname]["ansible_devices"].keys()|list}}"
- name: Check if the disk is partitioned and also ignore sda
stat: path=/dev/{{item}}1
with_items: disk_var
when: item != 'sda'
register: base_secondary_partition_{{item}}
- name: Create GPT partition table
command: /sbin/parted -s /dev/{{item}} mklabel gpt
with_items: disk_var
when: item != 'sda' and base_secondary_partition_{{item}}.stat.exists == false
显然,在格式化这些驱动器时涉及更多步骤,但在创建GPT分区表时,它在上一个任务中失败了。
这是它运行时的样子。你会看到它在上一个任务中失败了:
TASK: [role | Get disks] ******************************************************
ok: [server1.com]
TASK: [role | Check if the disk is partitioned] *******************************
skipping: [server1.com] => (item=sda)
ok: [server1.com] => (item=sdd)
ok: [server1.com] => (item=sdb)
ok: [server1.com] => (item=sdc)
TASK: [role | Create GPT partition table] *************************************
fatal: [server1.com] => error while evaluating conditional: base_secondary_partition_sdd.stat.exists == false
FATAL: all hosts have already failed -- aborting
知道如何查看条件base_secondary_partition_{{item}}.stat.exists
吗?我需要确保如果驱动器上有数据,则不会对其进行格式化。
答案 0 :(得分:47)
您无需使用item
盐注册结果。当您注册循环的结果(例如with_items
)时,注册的值将包含一个键results
,其中包含循环的所有结果的列表。 (见docs)
您可以循环显示第一个任务的已注册结果,而不是遍历原始设备列表:
- name: Check if the disk is partitioned and also ignore sda
stat: path=/dev/{{item}}1
with_items: disk_var
when: item != 'sda'
register: device_stat
- name: Create GPT partition table
command: /sbin/parted -s /dev/{{ item.item }} mklabel gpt
with_items: "{{ device_stat.results }}"
when:
- not item | skipped
- item.stat.exists == false
条件not item | skipped
负责处理原始循环(sda)中已过滤的元素将不会被处理。
虽然这可能是您问题的解决方案,但您的问题非常有趣。 Jinja2中似乎没有eval
功能。虽然您可以连接字符串,但不能将该字符串用作变量名来获取其值...
答案 1 :(得分:6)
你的任务可以像这样简单......
- stat:
path: /dev/{{item}}1
with_items: ansible_devices.keys()
when: item != 'sda'
register: stats
- command: /sbin/parted -s /dev/{{item.item}} mklabel gpt
with_items: stats.results
when: item.stat | default(false) and item.stat.exists