1. 程式人生 > >1. ansible-playbook 變量定義與引用

1. ansible-playbook 變量定義與引用

*** 傳遞 msg etc aml var rom 變量名 ssl

簡單的playbook

playbook 是ansible的核心組件,使用的是YAML語法.
下面請看簡單的playbook代碼

[root@LeoDevops playb]# cat nginx.yaml 
- hosts: all
  tasks:
  - name: Install Nginx Package
    apt: name=nginx state=present
  - name: Copy Nginx.conf
    template: src=./nginx.conf.j2 dest=/etc/nginx/nginx.conf  owner=root group=root mode=0644
    notify:
        - Restart Nginx Service
  handlers:
    - name: Restart Nginx Service
      service: name=nginx state=restarted
  1. host表示為所有的主機(all)
  2. tasks是任務集,我們在這個playbook裏面定義了三個task
  3. name表示為每個task的名字,name的下一行是action,表示這個task要完成什麽樣的動作。
  4. template 表示模塊復制
  5. notify 是觸發handler,表示當配置文件有改動後,就觸發handler動作
  6. handler在這裏是重啟nginx
  7. service name表示服務名,state表示要達到什麽狀態

幾個重要語法

在編寫playbook的時候,我們需要了解這幾個重要的關鍵詞:

  • pre_tasks: 設置playbook運行之前的tasks
  • post_tasks: 設置playbook運行之後的tasks

playbook變量與引用

我們在Inventory裏面定義好變量,比如:

  1. 我們在hosts裏面定義好變量
[root@LeoDevops playb]# grep -vE "(^$|^#)" /etc/ansible/hosts 
192.168.93.132  key=132
192.168.93.137  key=137
[nginx]
192.168.93.132
192.168.93.137
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.6
  1. 寫好palybook
[root@LeoDevops playb]# cat check_variable.yml 
- hosts: all
  gather_facts: False
  tasks:
    - name: Display Host Variable From Hostfile
      debug: msg="The {{ inventory_hostname  }} Value is {{ key  }}"
  1. 執行playbook
[root@LeoDevops playb]# ansible-playbook check_variable.yml 

PLAY [all] ************************************************************************************************************************************************************************************

TASK [Display Host Variable From Hostfile] ****************************************************************************************************************************************************
ok: [192.168.93.132] => {
    "msg": "The 192.168.93.132 Value is 132"
}
ok: [192.168.93.137] => {
    "msg": "The 192.168.93.137 Value is 137"
}

PLAY RECAP ************************************************************************************************************************************************************************************
192.168.93.132             : ok=1    changed=0    unreachable=0    failed=0   
192.168.93.137             : ok=1    changed=0    unreachable=0    failed=0 
  1. 另一種方式,直接在playbook定義變量
[root@LeoDevops playb]# cat p_vars.yaml 
- hosts: all
  gather_facts: False  #設置為false,那麽下面的debug模塊會生效
  vars:       # 先申明vars這個關鍵字
    key: "Ansible"  #這種方式定義,key: value的形式
  tasks:
    - name: display host variables from hostfile
      debug: msg="The {{ inventory_hostname  }} value is {{ key }}"
  1. 或者在playbook裏面引用有變量的文件
[root@LeoDevops playb]# cat p_vars.yaml
- hosts: all
  gather_facts: False
  vars_files:
    - var.json
  tasks:
    - name: display host variables from hostfile
      debug: msg="The {{ inventory_hostname  }} value is {{ key }}"
[root@LeoDevops playb]# cat var.json 
{"key":"json"}
另一種變量引用,定義全局變量針對主機組
  1. 在hosts的nginx裏面定義一個變量key,不在單獨對每個主機定義key
grep -vE "(^$|^#)" /etc/ansible/hosts 
[nginx]
192.168.93.132
192.168.93.137
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.6
key=nginx
  1. playbook保持不變
  2. 執行playbook
[root@LeoDevops playb]# ansible-playbook check_variable.yml 

PLAY [all] ************************************************************************************************************************************************************************************

TASK [Display Host Variable From Hostfile] ****************************************************************************************************************************************************
ok: [192.168.93.132] => {
    "msg": "The 192.168.93.132 Value is nginx"
}
ok: [192.168.93.137] => {
    "msg": "The 192.168.93.137 Value is nginx"
}

PLAY RECAP ************************************************************************************************************************************************************************************
192.168.93.132             : ok=1    changed=0    unreachable=0    failed=0   
192.168.93.137             : ok=1    changed=0    unreachable=0    failed=0 

通過命令行傳輸

  • 通過-e參數能給將變量傳入進去
[root@LeoDevops playb]# ansible-playbook check_variable.yml  -e "key=hehe"

PLAY [all] ************************************************************************************************************************************************************************************

TASK [Display Host Variable From Hostfile] ****************************************************************************************************************************************************
ok: [192.168.93.132] => {
    "msg": "The 192.168.93.132 Value is hehe"
}
ok: [192.168.93.137] => {
    "msg": "The 192.168.93.137 Value is hehe"
}

PLAY RECAP ************************************************************************************************************************************************************************************
192.168.93.132             : ok=1    changed=0    unreachable=0    failed=0   
192.168.93.137             : ok=1    changed=0    unreachable=0    failed=0  
  • -e指定文件的方式傳入變量
[root@LeoDevops playb]# cat var.json 
{"key":"json"}
[root@LeoDevops playb]# ansible-playbook check_variable.yml -e "@var.json"

PLAY [all] ************************************************************************************************************************************************************************************

TASK [Display Host Variable From Hostfile] ****************************************************************************************************************************************************
ok: [192.168.93.132] => {
    "msg": "The 192.168.93.132 Value is json"
}
ok: [192.168.93.137] => {
    "msg": "The 192.168.93.137 Value is json"
}

PLAY RECAP ************************************************************************************************************************************************************************************
192.168.93.132             : ok=1    changed=0    unreachable=0    failed=0   
192.168.93.137             : ok=1    changed=0    unreachable=0    failed=0   

register內的變量

ansible playbook內的task之間還可以互相傳遞數據,比如我們總共有兩個tasks,其中第二個task是否執行是需要判斷第1個task運行後的結果,這個時候我們就得在task之間傳遞數據,需要把第一個task執行的結果傳遞給第二個task,下面看看簡單的register的方式

[root@LeoDevops playb]# cat  p_register.yaml 
- hosts: u12
  tasks:
    - name: register variable
      shell: date
      register: info
    - name: display variable
      debug: msg="the variable is {{ info[‘stdout‘] }}"

使用vars_prompt傳入

ansible 還支持在運行playbook的時候通過交互式的方式給定義好的參數傳入變量值,只需要在playbook中定義vars_prompt 的變量名和交互式提示內容即可。當然ansible還可以對傳入的變量值進行加密處理。加密處理依賴於passlib python庫。請看簡單的 vars_prompt的例子

[root@LeoDevops playb]# cat p_prompt.yaml 
- hosts: all
  gather_facts: False
  vars_prompt:
    - name: "one"
      prompt: "please input your value"
      private: no
    - name: "two"
      prompt: "please input two value"
      default: ‘good‘  # 默認顯示一個值
      private: yes  #置為yes的話,那麽就是看不見自己輸入的什麽了
  tasks:
     - name: display one value
       debug: msg="one value is {{ one }}"
     - name: display two value
       debug: msg="two value is {{ two }}"

執行效果如下:

[root@LeoDevops playb]# ansible-playbook p_prompt.yaml 
please input your value: nihao
please input two value [good]: 

1. ansible-playbook 變量定義與引用