如果上一个任务失败,则只运行两个任务

问题描述:

我目前使用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相当陌生,所以我愿意接受任何想法和任何帮助,将不胜感激。谢谢!

你可能看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抹其他有效的文件系统,但这是另一个故事。希望有所帮助!

如果你不介意使用原始块设备没有分区,这段代码是相当幂:

- name: Make filesystem 
    filesystem: 
    fstype: ext4 
    dev: /dev/xvdb 

- name: Mount log drive 
    mount: 
    name: /log 
    src: /dev/xvdb 
    fstype: ext4 
    state: mounted 
+0

有了这个,如果EXT4文件系统的设备上已经存在,它重新创建和擦拭数据?或者它实质上是说“哦,它已经是ext4了,让我们跳过这个”?后者是 – Chiggins

+0

。如果ext4在那里,Ansible将什么都不做,只要说'好'。 –