如果先前的任务失败,则仅运行两个任务

时间:2017-04-05 16:23:54

标签: amazon-web-services ansible

我目前正在使用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相当新,所以我对任何想法持开放态度,我们将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

您可以查看conditionalsblocks

看看这个示例剧本:

这里我们尝试在/ 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