我正在尝试为我的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
我在这里缺少什么,如果驱动器已经安装,跳过命令的最佳方法是什么?
答案 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
数组,但我没有机会看到它在这种情况下是否有用。