Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如果前一个任务失败,则仅运行两个任务_Amazon Web Services_Ansible - Fatal编程技术网

Amazon web services 如果前一个任务失败,则仅运行两个任务

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卷(得到它)、附加(得到它)、创建分区(得到它)、格式

我目前正在使用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”。