Ansible(三)如何使用變量

使用變量可以簡化操作,除此之外,ansible還提供了變量可以用來獲取被控主機上的信息

普通變量

變量名稱要求

變量名稱中不能有空格,也不能有下劃線(_)以外的其他字符

如何引用變量

tasks中引用變量,需要使用{{}}將變量括起來,注意在變量名稱前後都有空格
當變量名稱在行首出現時,還需要使用雙引號""將整行括起來
在某些特殊情況下,也可不使用{{}},例如在when條件中,或者在debug模塊的var選項中

vars: 
 user: joe
tasks:
 - name: use variables 
   user:
   name: "{{ user }}"
 - name: use variables in debug
   debug:
     var: user

變量的作用範圍

當同一個變量名在不同級別都出現時,使用優先級最高的變量值

  • 全局變量
    一般在命令行中進行定義,對命令中的所有play生效,優先級最高
    ansible -e "user=root" -e "passwd=123"

  • play級別的變量
    play中進行定義,只對指定的play生效,優先級低於全局變量,高於主機級別的變量
---
- name: a play
  vars:
    - user: root
  • 主機級別的變量
    inventory文件或者指定的變量文件中定義,對相關的主機/主機組生效。優先級最低。

    • inventory文件中進行定義

      # 主機級別的變量 直接將變量寫在主機的後面
      servera user=root
      # 主機組級別的變量,使用[group:vars]進行定義
      [servers]
      servera
      serverb
      [servers:vars]
      user=root
    • 在變量文件中進行定義
      ansible會自動在當前目錄下尋找變量文件,主機變量文件在hostvars目錄中,主機組變量文件在groups_vars中。
      在指定目錄中創建與inventory中定義的主機/主機組同名的文件,文件中的變量會應用於對應的主機/主機組

變量矩陣

如果一個變量的值是一個列表,列表中的值還是一個列表,那麼就稱之爲變量矩陣,類似python中的字典嵌套字典

定義方式

users:
  bjones:
    first_name: Bob
    last_name: Jones
  acook:
    first_name: Anne
    last_name: Cook

調用方式

可以使用類似於python中字典的方式調用
users['bjones']['first_name']
也可以用以下方式調用
users.bjones.first_name
建議使用第一種方式,當變量名稱中包含關鍵字時,第二種方式可能會出現錯誤



幾種特殊的變量

register變量

可以在playbook運行的過程中,將task的運行結果賦予給某個變量,在後續的task中進行輸出,或者根據結果執行不同的操作

# 示例,輸出MySQL從庫的同步狀態
 - name: get slave status
   mysql_replication:
    login_user: root
    login_password: "{{ mysql_root_password }}"
    login_unix_socket: "{{ mysql_datadir }}/mysql.sock"
    login_port: "{{ mysql_port }}"
    mode: getslave
   register: slave_status

 - name: print slave status
   debug:
    msg: "Slave_IO: {{ slave_status.Slave_IO_Running }},Slave_SQL: {{ slave_status.Slave_SQL_Running }}"

facts變量

ansible在執行playbook時,默認會收集被控主機的信息,這些信息保存在facts變量中,以便根據被控主機信息的不同來執行不同的操作。

關閉playbook中的變量收集

---
- hosts: all
  gather_facts: no

使用adhoc收集facts變量

ansible all -m setup

facts變量內容

facts變量是以json格式保存的被控主機的信息,默認包括IP、主機名、磁盤、掛載、CPU、內存等信息
要查詢所有facts變量內容,可以使用ansible node1 -m setup > setup.json將變量保存到文件中進行查看

常用facts變量

  • IPV4地址 ansible_default_ipv4['address']
  • 主機名 ansible_hostname
  • 內存 ansible_memtotal_mb
  • 磁盤信息 ansible_devices
  • 掛載信息 ansible_mounts

    自定義facts變量

    默認情況下,setup模塊會從被控節點主機上的/etc/ansible/facts.d文件夾中獲取用戶定義變量。文件或者腳本以.fact結尾

# 自定義fact文件
# cat custom.fact 
[general]
package = httpd
service = httpd
state = started
enabled = true
# 調用自定義fact變量
# cat playbook.yml 
---
- name: Install Apache and starts the service
  hosts: webserver
  tasks:
    - name: Install the required package
      yum:
        name: "{{ ansible_facts['ansible_local']['custom']['general']['package'] }}"
        state: latest
    - name: Start the service
      service:
        name: "{{ ansible_facts['ansible_local']['custom']['general']['service'] }}"
        state: "{{ ansible_facts['ansible_local']['custom']['general']['state'] }}"
        enabled: "{{ ansible_facts['ansible_local']['custom']['general']['enabled'] }}"

magic變量

magic變量是本機的內容,包括inventory文件中的內容

---
- hosts: localhost
  tasks:
   - name: print magic variables
     debug:
       var: hostvars['localhost']
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章