【问题标题】:Only run two tasks if a previous task fails如果前一个任务失败,则只运行两个任务
【发布时间】:2017-04-06 01:31:57
【问题描述】:

我目前正在使用 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 还很陌生,所以我愿意接受任何想法,我们将不胜感激。谢谢!

【问题讨论】:

    标签: amazon-web-services ansible


    【解决方案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 来调整它以避免擦除其他有效文件系统,但这是另一回事。希望对您有所帮助!

    【讨论】:

      【解决方案2】:

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

      - 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'。
      猜你喜欢
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 2017-10-18
      • 1970-01-01
      相关资源
      最近更新 更多