Ansible-检查驱动器是否已安装

gkr*_*zek 2 ansible

我正在尝试为Ansible脚本创建一个EBS角色。我将创建EBS卷,并暂时自己通过控制台将其附加。我希望该角色运行命令并在尚未安装驱动器的情况下安装驱动器,但是如果已安装该驱动器,请跳过此操作。

我有特定于主机的变量,这些变量给出了磁盘和挂载点的列表:

ebs_vols:
  - drive: /dev/sdb
    mount_point: /mnt/ebs1
    directory: /var/lib/mysql
  - drive: /dev/sdc
    mount_point: /mnt/ebs2
    directory: /var/backups
Run Code Online (Sandbox Code Playgroud)

我想让我的任务使用df命令检查每个驱动器,并查看是否已安装。如果驱动器已安装,则跳过命令:

- name: Check if drives are already mounted
  shell: df | grep "{{item.drive}}" | wc -l
  with_items: "{{ebs_vols}}"
  register: ebs_checked

- name: output debug
  debug: var=ebs_checked

- name: Make filesystem
  filesystem:
    fstype: xfs
    dev: "{{item.item.drive}}"
  when: "{{item.stdout}} == 0"
  with_items: ebs_checked.results
Run Code Online (Sandbox Code Playgroud)

当我运行它时,似乎检查每个磁盘都很好,因为的输出debug是具有正确驱动器和stdout的对象。问题出在Make filesystem任务上。错误列出以下错误:

条件检查“ {{item.stdout}} == 0”失败。错误是:评估条件({{item.stdout}} == 0)时出错:“ ansible.vars.unsafe_proxy.AnsibleUnsafeText对象”没有属性“ stdout” \ n \ n

我在这里缺少什么?如果已经安装了驱动器,跳过命令的最佳方法是什么?

tec*_*raf 5

您不能再在Ansible中使用“裸变量”。以下行使Ansible将ebs_checked.results值解释为字符串:

with_items: ebs_checked.results
Run Code Online (Sandbox Code Playgroud)

改用正确的语法:

with_items: "{{ ebs_checked.results }}"
Run Code Online (Sandbox Code Playgroud)