2017-04-05 33 views
0

我目前使用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相當陌生,所以我願意接受任何想法和任何幫助,將不勝感激。謝謝!

回答

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

如果你不介意使用原始塊設備沒有分區,這段代碼是相當冪:

- 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將什麼都不做,只要說'好'。 –

相關問題