1. 程式人生 > >ansible 變量簡明入門

ansible 變量簡明入門

列表 截取 ucc 再次 cmd 外部 -m dex define

ansible 為什麽需要變量?

ansible 是用 python 語言編寫的,如果連變量都不支持,要它何用?

ansible 的變量用在什麽地方?

我們在安裝 ansible 後,最常使用它的方式就是 ansible 和 ansible-playbook。在這兩種方式,都可以使用變量。

ansible 的變量從哪裏來?

例如:
1. 用戶自定義的變量,在playbook 裏定義的 vars 關鍵字,或者在其他文件定義的變量。
2. 無需用戶自定義,而是來自遠程主機收集到的 facts 變量。
3. template 文件可以直接使用以上兩種變量。
4. 從 tasks 執行後返回的結果,可以註冊成為一個變量,留待以後繼續使用。
5. playbook 在執行時,支持臨時從外部提供變量。

ansible 變量的使用舉例

1. 用戶自定義變量
[root@centos_7 roles]# cat a.yml 
---
    - hosts: test
      gather_facts: False
      vars:
        var1: haha
        var2: your name is
      tasks:
        - debug: msg="{{var2}} {{var1}}"

說明:在 playbook 層的vars 字段後,定義了用戶的變量,那麽在後面所有地方都能使用這些變量了,除非,在後面有同名的變量,則會覆蓋。

執行結果:
[root@centos_7 roles]# ansible-playbook a.yml 

TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": "your name is haha"
}

變量覆蓋的情況:

[root@centos_7 roles]# cat a.yml 
---
    - hosts: test
      gather_facts: False
      vars:
        var1: haha
        var2: your name is
      tasks:
        - debug: msg="{{var2}} {{var1}}"
          vars:
            - var1: hehe

說明:在tasks 層裏的 var1 變量會覆蓋playbook 層聲明的 var1 變量。

所以,執行的結果變成:

TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": "your name is hehe"
}
1.1 從playbook 外部文件傳入變量

只要將上面的例子進行一點小修改,就可以了

[root@centos_7 roles]# cat a.yml 
---
- hosts : test
  gather_facts: False 
  vars_files:
    - var_file1.yml
  tasks:
    - debug: msg="{{var1}}"

說明: 在playbook 裏需要使用變量文件,可以通過 vars_files 字段聲明,直接聲明文件名(相對路徑,相對當前執行的playbook 文件),也可以用絕對路徑聲明變量文件的路徑。

var_file1.yml 裏的內容:
var1:  hello Han×××

執行結果:
TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": "hello Han×××"
}
2. 遠程主機收集的 facts 變量
playbook 執行時,默認會運行 setup 模塊,收集遠程主機的信息。setup 模塊收集到的信息,是 jason 格式。
運行 ansible  test  -m   setup , 可以看到返回的遠程主機信息(節選部分的信息而已):
192.168.188.109 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.188.109"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::20c:29ff:fe8e:cf65"
        ], 
        "ansible_apparmor": {
            "status": "disabled"
        }, 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "05/19/2017", 
        "ansible_bios_version": "6.00", 

這些 facts 變量,playbook 都是可以直接使用的,如何使用?

例如,有 playbook 文件:
[root@centos_7 roles]# cat a.yml 
---
    - hosts: test
      tasks:
        - debug: msg="{{ansible_all_ipv4_addresses}} {{ansible_os_family}}"

執行結果:
TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": "[u‘192.168.188.109‘] RedHat"
}

特別說明一點:
facts數據的頂級key為ansible_facts,在引用時應該將其包含在變量表達式中。但自動收集的facts比較特殊,它以ansible_facts作為key,ansible每次收集後會自動將其註冊為變量,所以facts中的數據都可以直接通過變量引用,甚至連頂級key ansible_facts都要省略。
3. template 使用變量

template module在Ansible中很常用,而它在使用的時候又沒有顯式的指定template文件中的值,有時候用戶會對template文件中使用的變量感到困惑,所以在這裏再次強調下。

在playbook中定義的變量,可以直接在template中使用,同時facts變量也可以直接在template中使用,當然也包含在inventory裏面定義的host和group變量。只要是在playbook中可以訪問的變量,都可以在template文件中使用。

Ansible模版文件使用變量的語法是Python的template語言Jinja2。

在下面的例子template index.html.j2中,直接使用了以下變量:

系統變量 ** {{ ansible_hostname }} **, ** {{ ansible_default_ipv4.address }} **

用戶自定義的變量 ** {{ defined_name }} **

index.html.j2文件:

<html>
<title>Demo</title>
<body>
<div class="block" style="height: 99%;">
    <div class="centered">
        <h1>#46 Demo \{\{ defined_name \}\}</h1>
        <p>Served by \{\{ ansible_hostname \}\} (\{\{ ansible_default_ipv4.address \}\}).</p>
    </div>
</div>
</body>
</html>
4. 從tasks 返回的結果,需要註冊成為變量才能使用
[root@centos_7 roles]# cat a.yml 
---
- hosts : test
  gather_facts: False 
  tasks:
    - shell : echo hello world
      register: var
    - debug: msg="{{var}}"

說明: 
執行shell 模塊後,返回信息是 jason 格式的。再通過 register 註冊到 var 變量。
然後,通過 debug 模塊,輸出 var 變量。

執行結果(截取部分):
TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": {
        "changed": true, 
        "cmd": "echo hello world", 
        "delta": "0:00:00.001890", 
        "end": "2018-01-18 17:12:00.178123", 
        "failed": false, 
        "rc": 0, 
        "start": "2018-01-18 17:12:00.176233", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "hello world", 
        "stdout_lines": [
            "hello world"
        ]
    }
}
4.1 如何對jason 變量引用?

既然在這裏已經說到 jason 變量了,那就順便說說關於這類變量的引用。
通常可以用 "." 或者 index 引用。
例如,上一個例子中,我們想輸出 stdout_lines ,則引用可以有:
var.stdout
或者, var[‘stdout‘] 。 這兩種方式都是可以的。

所以,對 playbook 腳本進行一點修改:

[root@centos_7 roles]# cat a.yml 
---
- hosts : test
  gather_facts: False 
  tasks:
    - shell : echo hello world
      register: var
    - debug: msg="{{var.stdout}}"

執行結果:
TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": "hello world"
}

如果我們要引用的變量是一個列表,例如上一個例子裏的 stdout_lines 字段,就是一個列表,我們如何輸出呢?可以使用 index 下標引用:

[root@centos_7 roles]# cat a.yml 
---
- hosts : test
  gather_facts: False 
  tasks:
    - shell : echo hello world
      register: var
    - debug: msg="{{var[‘stdout_lines‘][0]}}"

執行結果:
TASK [debug] ****************************************************************************************************************
ok: [192.168.188.109] => {
    "msg": "hello world"
}

所以,在看到這裏,應該能明白,ansible 的 setup 模塊收集的 facts 變量,正確的引用方式了吧。

5. 執行playbook 時在外部傳入變量

例子:

[root@centos_7 roles]# cat a.yml 
---
- hosts : test
  gather_facts: False 
  tasks:

    - debug: msg="{{var1}}"

執行: 
[root@centos_7 roles]# ansible-playbook a.yml -e ‘var1="hello LiZimei"‘

結果:
[root@centos_7 roles]# ansible-playbook a.yml -e ‘var1="hello LiZimei"‘
5.1 在運行 playbook 時,也可以通過外部文件傳入變量

使用命令的方式:
ansible-playbook a.yml -e ‘@var_file1.yml‘
用“@”符號引用文件

總結

上面的內容是 ansible 變量繼續深入學習的最基礎知識了。

ansible 變量簡明入門