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

时间:2017-02-20 20:47:23

标签: ansible

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

我有托管特定的vars,它们提供了磁盘和挂载点列表:

ebs_vols:
  - drive: /dev/sdb
    mount_point: /mnt/ebs1
    directory: /var/lib/mysql
  - drive: /dev/sdc
    mount_point: /mnt/ebs2
    directory: /var/backups

我希望我的任务使用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

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

  

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

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

2 个答案:

答案 0 :(得分:4)

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

with_items: ebs_checked.results

请改用正确的语法:

with_items: "{{ ebs_checked.results }}"

答案 1 :(得分:1)

您可能想尝试:

- name: Check if drives are already mounted
  command: '/bin/mountpoint -q {{item.directory}}'
  with_items: '{{ebs_vols}}'
  register: ebs_checked
  changed_when: "ebs_checked.rc != 0"

此外,ansible的设置模块确实填充了ansible_mounts数组,但我没有机会看到它在这种情况下是否有用。