自動化運維Ansible之變量使用


1、Playbook 變量

ansible中使用變量,能夠讓我們的工作變得更加靈活

定義變量

變量名應該由字母、數字、下划線組成,變量名需要字母開頭,ansible內置的關鍵字不能作為變量名使用

2、Playbook 變量定義

使用vars關鍵字可以在當前playbook中進行變量定義,讓我們要使用變量的時候,則需要引用對應變量名,使用{{ 變量名 }}可以引用對應變量。

變量簡單定義

- hosts: all
  vars:     #定義變量
    file_name: jsn_yaml_vars    #變量名(隨意):file_name,變量的內容:jsn_yaml_vars
  tasks:    #{{ file_name }}引用上面定義的變量
  - name: 應用變量名:file_name
    file: path=/tmp/{{ file_name }} state=touch

定義多個變量

- hosts: all
  vars:   
    t1: v1
    t2: v2

除了上述語法,也可用YAML快序列語法定義變量

- hosts: all
  vars:   
    - t1: v1
    - t2: v2

定義變量時,還可以類似以"屬性"的方式定義變量

- hosts: 10.4.7.7
  vars:
    nginx:
      proxy_1: /etc/nginx/conf.d/nginx_1.proxy
      proxy_2: /etc/nginx/conf.d/nginx_2.proxy
  tasks:
  - name: task1
    file:
      path: "{{ nginx.proxy_1 }}"
      state: touch
  - name: task1
    file:
      path: "{{ nginx['proxy_2'] }}" # 第二種引用變量.屬性的方法
      state: touch

Node:注意我們在使用變量使用了雙引號,而在最開頭的例子中並沒有在引用變量的時候使用雙引號,那是因為第一個實例中變量在被引用的時候,並沒有處於開頭的位置path=/tmp/{{ file_name }},所以在不需要雙引號,但是path: "{{ nginx.proxy_1 }}"處於開頭位置的變量,就需要雙引號

定義變量寫入到指定文件中,然后在playbook中引用

1.創建nginx_vars.yaml文件,定義變量

nginx:
  proxy_1: /etc/nginx/conf.d/nginx_1.proxy
  proxy_2: /etc/nginx/conf.d/nginx_2.proxy

2.在nginx_vars.yaml文件中定義完變量后,即可在playbook中引入包含變量的文件

- hosts: 10.4.7.7
  vars_files:
    - ~/nginx_vars.yaml
  tasks:
  - name: task1
    file:
      path: "{{ nginx.proxy_1 }}"
      state: touch
  - name: task1
    file:
      path: "{{ nginx['proxy_2'] }}" 
      state: touch

該例中使用vars_files關鍵字引入對應的變量文件,然后使用文件中的變量,該關鍵字可以引入一個變量文件,也可以引入多個變量文件,每個被引入的文件都需要以-開頭,varsvars_files可以同時使用

playbook引用變量,執行的時候指定賦值變量

1.創建yaml

- hosts: all
  tasks:
  - name: Create New File
    file: path=/tmp/{{ file_name }} state=touch

2.playbook執行的時候參數--extra-vars指定賦值給變量

$ ansible-playbook f1.yaml --extra-vars "file_name=jsn_extra-vars"

3、Playbook 變量注冊

register關鍵字可以存儲指定命令的輸出結果到一個自定義的變量中,它還有一個非常棒的用法,就是我們需要判斷對執行了某個操作或某個命令后,如何做出相應的響應處理(執行其它的ansible語句),也會用到它。

register簡單實用

1.f1.yaml文件內容如下

- hosts: 10.4.7.7
  tasks:
    - name: register vars
      shell: hostname
      register: System_Status
    - name: display vars
      debug: msg={{ System_Status.stdout }}

2.執行playbook

[root@m01 ~]#  ansible-playbook f1.yaml

PLAY [10.4.7.7] ****************************************************************

TASK [Gathering Facts] *********************************************************
ok: [10.4.7.7]

TASK [register vars] ***********************************************************
changed: [10.4.7.7]

TASK [display vars] ************************************************************
ok: [10.4.7.7] => {
    "msg": "web01"
}

PLAY RECAP *********************************************************************
10.4.7.7                   : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  • 第一個shell執行完后,使用register獲取數據到System_Status
  • System_Status是一個key/value字典
  • debug輸出System_Status.stdout的具體內容

register生產示例

我需要判斷sda1是否存在,如果存在則執行文件拷貝

- hosts: 10.4.7.7
  tasks:
    - name:  Create a register to represent the status if the /dev/sda1 exsited
      shell: df -h  | grep sda1
      register: dev_sda1_result
      ignore_errors: True
      
    - name: Copy test.sh to all hosts
      copy: src=/root/test.sh dest=/tmp/test.sh mode=755
      when: dev_sda1_result.rc == 0 

df -h | grep sda1執行后,會在dev_sda1_result里寫入執行結果,然后dev_sda1_result.rc 里的rc就是命令的返回狀態,非0表示執行失敗,ignore_errors關鍵字一定要設置為True,否則如果命令執行不成功,即echo $?不為0,則在語句后面的ansible語句不會被執行,導致程序中止。

register多條件判斷

然后在when中用and或者or來組合判斷。比如當兩種條件之一成功:

    - name: Copy test.sh to all hosts
      copy: src=/root/test.sh dest=/tmp/test.sh mode=755
      when: ( dev_sda1_result.rc == 0 ) or ( dev_sda2_result.rc == 0  )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM