2015-09-03 50 views
2

我有一個簡單的劇本是副本的nginx服務器的一些配置文件,然後發出service nginx reload命令出現錯誤後運行命令:如何ansible處理

--- 
- hosts: mirrors 
    tasks: 
    - name: Installs nginx web server 
     apt: pkg=nginx state=installed update_cache=true 
     notify: 
     - start nginx 

    - name: Copy vhost file 
     copy: src=vhost/test.vhost dest=/etc/nginx/sites-available/ mode=0644 

    - name: Symlink vhost file to enabled sites 
     file: src=/etc/nginx/sites-available/test.vhost dest=/etc/nginx/sites-enabled/test.vhost state=link 
     notify: 
     - reload nginx 

    handlers: 
    - name: start nginx 
     service: name=nginx state=started 

    - name: reload nginx 
     service: name=nginx state=reloaded 

現在的問題是,它可能會發生的test.host文件包含錯誤,nginx將無法正確重新載入。如果發生,我想運行一個命令systemctl status nginx.service,並在執行完成的劇本時查看它的輸出。我怎樣才能添加這個「錯誤處理程序」?

回答

2

如果處理程序輸出告訴你有關失敗的信息,那麼可以使用ignore_errorsregister關鍵字將錯誤處理放在一起。

設置你的處理程序沒有結束失敗並結束遊戲時,得到一個錯誤代碼回來了,但註冊的輸出變量:

handlers: 
    - name: reload nginx 
    service: name=nginx state=reloaded 
    ignore_errors: True 
    register: nginx_reloaded 

然後回到任務部分,叫flush_handlers到執行所有排隊的處理程序,否則將等待直到遊戲結束。在添加一個任務,去詢問Nginx的狀態的服務器時,您nginx_reloaded變量有一個非零返回代碼,然後從與調試模塊打印的信息:

- name: Symlink vhost file to enabled sites 
    file: src=/etc/nginx/sites-available/test.vhost dest=/etc/nginx/sites-enabled/test.vhost state=link 
    notify: 
    - reload nginx 

- meta: flush_handlers 

- name: Get the Nginx service status if it failed to failed. 
    command: "systemctl status nginx.service" 
    register: nginx_status 
    when: nginx_reloaded.rc != 0 

- debug: var=nginx_status 
    when: nginx_reloaded.rc != 0 

當然,一個更好的解決方案是將這些錯誤修復到配置文件中,並通過Ansible輸出來解決這些錯誤,與SSH到目標主機進行檢查相比有一定的侷限性。

0

爲什麼不使用Ansible模塊來驗證配置?:

例如能力:

- template: src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s' 

- lineinfile: dest=/etc/sudoers state=present regexp='^%ADMIN ALL\=' line='%ADMIN ALL=(ALL) NOPASSWD:ALL' validate='visudo -cf %s' 

- replace: dest=/etc/apache/ports regexp='^(NameVirtualHost|Listen)\s+80\s*$' replace='\1 127.0.0.1:8080' validate='/usr/sbin/apache2ctl -f %s -t' 
+0

這是一個不錯的解決方案,但似乎「驗證」在複製到位之前運行。所以我不能用它來驗證nginx配置([這是爲什麼](http://serverfault.com/a/637476))。 – SiliconMind