Ansible—— 30. playbook 任務間的流程控制

1. 任務委託

默認情況下,ansible所有任務都是在我們指定的機器上面運行的,當在一個獨立的集羣環境配置時,這並沒有什麼問題。而在有些情況下,比如給某臺服務器發送通知或者向監控服務器中添加被監控的主機,這個時候任務就需要在特定的主機上運行,而非一開始指定的所有主機,此時就需要ansible的委託任務。
使用delegate_to關鍵字可以配置任務在指定的服務器上執行,而其他任務還是在hosts關鍵字配置的所有機器上執行,當到了這個關鍵字所在的任務時,就使用委託的機器運行。

查看MySQL是否在運行狀態,因此在檢查之前首先關掉162上的mysql服務。

[root@test2 playbook]# cat test.yml 
---
 - hosts: all
   remote_user: root
   tasks:
     - name: stop the db server
       service: name=mysqld state=stopped
       delegate_to: 10.0.102.162      #這裏使用了委託,僅關閉162這臺服務器上,這個play僅在162這臺服務器上執行。
     - name: check mysql status
       service: name=mysqld state=running
[root@test2 playbook]# cat test.yml 
---
 - hosts: all
   remote_user: root
   tasks:
     - name: create the test file
       local_action: shell touch test1111         #在本地創建一個測試文件       
     - name: check mysql status
       service: name=mysqld state=running

2. 任務暫停

有些情況下,一些任務的運行需要等待一些狀態的恢復,比如某一臺主機或者應用剛剛重啓,我們需要等待它上面的某個端口開啓,此時我們就不得不將正在運行的任務暫停,直到其狀態滿足我們的需求。

- name: wait for webserver to start
  local_action:
    module: wait_for
    host: webserver1
    port: 80
    delay: 10
    timeout: 300
    state: startted

#這個實例中,這個任務將會每10s檢查一次主機webserver1上面的80端口是否開啓,如果超過了300s,80端口仍未開啓,將會返回失敗信息。

3. 交互式提示

在少數情況下,ansible任務運行的過程中需要用戶輸入一些數據,這些數據要麼比較祕密不方便,或者數據是動態的,不同的用戶有不同的需求,比如輸入用戶自己的賬戶和密碼或者輸入不同的版本號會觸發不同的後續操作等。ansible的vars_prompt關鍵字就是用來處理上述這種與用戶交互的情況的。

---
 - hosts: localhost
   remote_user: root
   vars_prompt:
      - name: share_user
        prompt: "what is your network username?"
        private: no
 
      - name: share_pass
        prompt: "what is your network password"
        private: no
   tasks:
     - name: out
       command: echo {{ share_user }} {{ share_pass }} 
[root@test2 playbook]# ansible-playbook test.yml --limit 10.0.102.162

手動輸入的變量值,在後面的play中仍然可以用{{ var_name }}的形式調用。
關鍵字vars_prompt幾個常用的選項總結如下:
private: 默認值爲yes,表示用戶輸入的值在命令行不可見;將值設爲no時,用戶輸入可見。
default:爲變量設置默認值,以節省用戶輸入時間。
confirm:特別適合輸入密碼的情況,如果將其設置爲yes,則會要求用戶輸入兩次,以增加輸入的安全性。

 vars_prompt:
    - name: "solution"
      prompt: "Choose the solution you want \n
      A: solutionA\n
      B: solutionB\n
      C: solutionC\n"
      private: no
      default: A
---
- hosts: test70
  remote_user: root
  vars_prompt:
    - name: "user_name"
      prompt: "Enter user name"
      private: no
    - name: "user_password"
      prompt: "Enter user password"
  tasks:
   - name: create user
     user:
      name: "{{user_name}}"
      password: "{{user_password}}"

此時輸入的密碼不對,因爲需要加密,才能登錄,但需要安裝pip install passlib,安裝pip ,安裝passlib庫,所以改進如下:

---
- hosts: test70
  remote_user: root
  vars_prompt:
    - name: "hash_string"
      prompt: "Enter something"
      private: no
      encrypt: "sha512_crypt"
  tasks:
   - name: Output the string after hash
     debug:
      msg: "{{hash_string}}"

使用confirm

---
- hosts: test70
  remote_user: root
  vars_prompt:
    - name: "user_name"
      prompt: "Enter user name"
      private: no
    - name: "user_password"
      prompt: "Enter user password"
      encrypt: "sha512_crypt"
      confirm: yes
  tasks:
   - name: create user
     user:
      name: "{{user_name}}"
      password: "{{user_password}}"

————Blueicex 2020/03/26 19:12 [email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章