Ansible - 检查驱动器是否已挂载

3
我想为我的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

我想让我的任务使用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的输出是一个具有正确驱动器和标准输出的对象。问题出在创建文件系统任务上。出现以下错误:

条件检查'{{item.stdout}} == 0'失败。 错误是:在评估条件时发生错误({{item.stdout}} == 0):'ansible.vars.unsafe_proxy.AnsibleUnsafeText object'没有属性'stdout'

我错过了什么?如果驱动器已经挂载,跳过命令的最佳方法是什么?
2个回答

6
你在Ansible中不能再使用"裸变量"。下面这一行代码会导致Ansible将ebs_checked.results的值解释为字符串:
with_items: ebs_checked.results

请使用正确的语法:
with_items: "{{ ebs_checked.results }}"

啊,我明白了。新手错误。我对Ansible还很陌生,我本来以为会出现语法错误,而不是它实际尝试执行它。谢谢! - gkrizek
没有语法错误。item 被赋予了一个字符串值 ebs_checked.results,但是你得到了一个错误,说它不包含你尝试使用的 stdout 键。 - techraf
在Ansible 2.0中,with_循环中使用裸变量已被弃用,并在2.2中删除 - 请参阅Ansible 2.0移植指南 - RichVel

2

您可以尝试以下方法:

- 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的setup模块确实会填充一个ansible_mounts数组,但我还没有机会看看它在这种情况下是否有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接