我目前正在使用Ansible 2.2在AWS中编写脚本并部署系统日志服务器。我们拥有的一个先决条件是拥有一个持久的EBS卷,该卷将保留一个月的日志,直到我们将它们发送到S3。因此,如果我们需要拆除syslog并通过Ansible重新部署它,我们只需将其重新连接到新部署的服务器,它仍然会有之前的日志。那部分很好,我已经处理好了。
我的问题是我试图让整个任务完全自动化,如果EBS卷不存在X,Y或Z的原因,我们创建一个新的EBS卷(得到它),附加,(得到它,创建分区(得到它),格式化(得到它),然后安装它(得到它)。希望以下代码有助于理解:
- name: Create log partition
shell: /bin/echo -e "n\np\n1\n\n\nw" | sudo fdisk /dev/xvdb
- name: Format log partition
filesystem:
fstype: ext4
dev: "/dev/xvdb1"
- name: Mount log drive
mount:
name: /log
src: "/dev/xvdb1"
fstype: ext4
state: mounted
该代码工作正常,但我意识到在运行此代码并重新连接现有EBS卷时,我仍然会重新分区并格式化卷,删除我的历史数据并从头开始,这是非常不好的。
我希望完成的是在分区和格式化之前进行某种检查,以确保我们不会消除数据。我认为最好的方法是尝试安装驱动器,如果成功,则跳过分区和格式化。但是如果驱动器无法安装,则进行分区,格式化和安装。
我对Ansible相当新,所以我对任何想法持开放态度,我们将不胜感激。谢谢!
答案 0 :(得分:1)
您可以查看conditionals和blocks
看看这个示例剧本:
这里我们尝试在/ dev / xvdb1分区上创建一个fs。如果它不存在或包含另一个文件系统(小心!) - 注册“结果”将包含有关该失败任务的信息。之后,我们使用您的操作定义一个块,只有在您之前的任务失败时才会执行该块。
- name: create new fs on device
filesystem:
fstype: ext4
dev: /dev/xvdb1
register: result
ignore_errors: true
- block:
- name: Create log partition
shell: /bin/echo -e "n\np\n1\n\n\nw" | sudo fdisk /dev/xvdb
- name: Format log partition
filesystem:
fstype: ext4
dev: "/dev/xvdb1"
- name: Mount log drive
mount:
name: /log
src: "/dev/xvdb1"
fstype: ext4
state: mounted
when: result|failed
您可能希望通过解析result.stderr
来调整此值以避免擦除其他有效的文件系统,但这是另一个故事。希望有所帮助!
答案 1 :(得分:1)
如果你不介意使用没有分区的原始块设备,这段代码是相当幂等的:
- name: Make filesystem
filesystem:
fstype: ext4
dev: /dev/xvdb
- name: Mount log drive
mount:
name: /log
src: /dev/xvdb
fstype: ext4
state: mounted