Amazon web services 如果前一个任务失败,则仅运行两个任务
我目前正在使用Ansible 2.2在AWS中编写脚本并部署syslog服务器。我们必须具备的一个先决条件是拥有一个持久的EBS卷,该卷将保存日志一个月,直到我们将它们发送到S3为止。因此,如果我们需要拆下syslog并通过Ansible重新部署它,我们只需将它重新连接到新部署的服务器上,它仍然会保留以前的日志。那部分很好,我已经处理好了 我的问题是,我正试图使整个任务完全自动化,如果EBS卷由于X、Y或Z原因不存在,我们将创建一个新的EBS卷(得到它)、附加(得到它)、创建分区(得到它)、格式化(得到它)和装载(得到它)。希望以下代码有助于理解这一点:Amazon web services 如果前一个任务失败,则仅运行两个任务,amazon-web-services,ansible,Amazon Web Services,Ansible,我目前正在使用Ansible 2.2在AWS中编写脚本并部署syslog服务器。我们必须具备的一个先决条件是拥有一个持久的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的新手,所以我愿意接受任何想法,任何帮助都将不胜感激。谢谢 你可以看看
请看这个示例剧本:
这里我们尝试在/dev/xvdb1分区上创建一个fs。如果它不存在或包含另一个文件系统(请小心!)-register“result”将包含关于失败任务的信息。之后,我们定义一个包含您的操作的块,只有在您的上一个任务失败时才会执行该块
- 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
,来调整它以避免擦除其他有效的文件系统,但这是另一回事。希望有帮助 你可以看看
请看这个示例剧本:
这里我们尝试在/dev/xvdb1分区上创建一个fs。如果它不存在或包含另一个文件系统(请小心!)-register“result”将包含关于失败任务的信息。之后,我们定义一个包含您的操作的块,只有在您的上一个任务失败时才会执行该块
- 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
,来调整它以避免擦除其他有效的文件系统,但这是另一回事。希望有帮助 如果您不介意使用没有分区的原始块设备,那么这段代码相当幂等:
- name: Make filesystem
filesystem:
fstype: ext4
dev: /dev/xvdb
- name: Mount log drive
mount:
name: /log
src: /dev/xvdb
fstype: ext4
state: mounted
如果您不介意使用没有分区的原始块设备,那么这段代码相当幂等:
- name: Make filesystem
filesystem:
fstype: ext4
dev: /dev/xvdb
- name: Mount log drive
mount:
name: /log
src: /dev/xvdb
fstype: ext4
state: mounted
这样,如果设备上已经存在ext4文件系统,它会重新创建它并擦除数据吗?或者它本质上是说“哦,它已经是ext4了,让我们跳过这个”?后者。如果存在ext4,Ansible将什么也不做,只需说“ok”。这样,如果设备上已经存在ext4文件系统,它会重新创建它并擦除数据吗?或者它本质上是说“哦,它已经是ext4了,让我们跳过这个”?后者。如果有ext4,Ansible将什么也不做,只需说“ok”。