第5章 ansible的各種變量定義方式和變量引用


第5章 ansible的各種變量定義方式和變量引用

  • 5.1. ansible facts
  • 5.2. 變量引用json數據的方式

5.2.1. 引用json字典數據的方式
5.2.2. 引用json數組數據的方式
5.2.3. 引用facts數據

  • 5.3. 設置本地facts
  • 5.4. 輸出和引用變量
  • 5.5. 注冊和定義變量的各種方式

5.5.1. register注冊變量
5.5.2. set_fact定義變量
5.5.3. vars定義變量
5.5.4. vars_files定義變量
5.5.5. roles中的變量
5.5.6. 命令行傳遞變量
5.5.7. 借助with_items疊加變量
5.5.8. inventory中主機變量和主機組變量
5.5.9. 內置變量


第5章 ansible的各種變量定義方式和變量引用

5.1. ansible facts

facts組件是用來收集被管理節點信息的,使用setup模塊可以獲取這些信息。

[root@localhost ~]# ansible-doc -s setup
- name: Gathers facts about remote hosts

# 以下是收集信息示例的部分截取內容
[root@localhost ~]# ansible web1 -m setup
web1 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "10.0.0.12"
        ],
        "ansible_all_ipv6_addresses": [
            "fe80::20c:29ff:feb1:919e"
        ],
        "ansible_apparmor": {
            "status": "disabled"
        },
        "ansible_architecture": "x86_64",
        "ansible_bios_date": "07/31/2013",
        "ansible_bios_version": "6.00",
        "ansible_cmdline": {
            "BOOT_IMAGE": "/vmlinuz-3.10.0-693.el7.x86_64",
            "LANG": "en_US.UTF-8",
            "quiet": true,
            "rhgb": true,
            "ro": true,
            "root": "UUID=de7cadf7-bd2c-40d5-b68e-0c4dfea77d80"
        },
        "ansible_date_time": {
            "date": "2020-02-25",
            "day": "25",
            "epoch": "1582619760",
            "hour": "16",
            "iso8601": "2020-02-25T08:36:00Z",
            "iso8601_basic": "20200225T163600276641",
            "iso8601_basic_short": "20200225T163600",
            "iso8601_micro": "2020-02-25T08:36:00.276815Z",
            "minute": "36",
            "month": "02",
            "second": "00",
            "time": "16:36:00",
            "tz": "CST",
            "tz_offset": "+0800",
            "weekday": "Tuesday",
            "weekday_number": "2",
            "weeknumber": "08",
            "year": "2020"
        },

用filter可以篩選指定的facts信息。例如:

[root@localhost ~]# ansible web1 -m setup -a 'filter=changed'
web1 | SUCCESS => {
    "ansible_facts": {},
    "changed": false
}
[root@localhost ~]# ansible web1 -m setup -a 'filter="*ipv4"'
web1 | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "10.0.0.12",
            "alias": "ens32",
            "broadcast": "10.0.0.255",
            "gateway": "10.0.0.2",
            "interface": "ens32",
            "macaddress": "00:0c:29:b1:91:9e",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "10.0.0.0",
            "type": "ether"
        }
    },
    "changed": false
}

facts收集的信息是json格式的,其內任一項都可以當做變量被直接引用(如在playbook,jinja2模板中)引用。


5.2. 變量引用json數據的方式

在ansible中,任何一個模塊都會返回json格式的數據,即使是錯誤信息都是json格式的。

在ansible中,json格式的數據,其內每一項都可以通過變量來引用它。當然,引用的前提是先將其注冊為變量。

例如,下面的playbook是將shell模塊中echo命令的結果注冊為變量,並使用debug模塊輸出。

[root@localhost ansible]# cat test1.yml
---
    - hosts: web1
      tasks:
        - shell: echo hello world
          register: say_hi
        - debug: var=say_hi

[root@localhost ansible]# ansible-playbook test1.yml

PLAY [web1] ********************************************************************

TASK [shell] *******************************************************************
changed: [web1]

TASK [debug] *******************************************************************
ok: [web1] => {
    "say_hi": {
        "changed": true,
        "cmd": "echo hello world",
        "delta": "0:00:00.164212",
        "end": "2020-02-25 16:40:31.244806",
        "failed": false,
        "rc": 0,
        "start": "2020-02-25 16:40:31.080594",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "hello world",
        "stdout_lines": [
            "hello world"
        ]
    }
}

PLAY RECAP *********************************************************************
web1                       : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

可以看出,結果是一段json格式的數據,最頂端的key為say_hi,其內是一大段的字典(即使用大括號包圍的),其中的stdout_lines 還包含了一個json數組,也就是所謂的yaml列表項(即使用中括號包圍的)。

5.2.1. 引用json字典數據的方式

如果想要輸出json數據的某一字典項,則應該使用"key.dict"或"key['dict']"的方式應用。例如最常見的stdout項“hello world”是想要輸出的項,一下兩種方式都能引用該字典變量。

[root@localhost ansible]# cat test1.yml
---
    - hosts: web1
      tasks:
        - shell: echo hello world
          register: say_hi
        - debug: var=say_hi.stdout
        - debug: var=say_hi['stdout']

# 部分輸出結果
TASK [debug] *************************************************************************************
ok: [web1] => {
    "say_hi.stdout": "hello world"
}

TASK [debug] *************************************************************************************
ok: [web1] => {
    "say_hi['stdout']": "hello world"
}

"key.dict"或"key['dict']"的方式都能引用,但在dict字符串本身就包含"."的時候,應該使用中括號的方式應用。例如:

anykey['192.168.100.65']

5.2.2. 引用json數組數據的方式

如果想要輸出json數據中的某一數組項(列表項),則應該使用"key[N]"的方式引用數組中的第N項,其中N是數組的index,從0開始計算。如果不使用index,則輸出的是整個數組列表。

例如想要輸出上面的stdout_lines中的“hello world”,它是數組stdout_lines中第一項所以使用stdout_lines[0]來引用,再加上stdout_lines上面的say_hi,於是引用方式如下:

---
    - hosts: web1
      tasks:
        - shell: echo hello world
          register: say_hi
        - debug: var=say_hi.stdout_lines[0]

# 執行部分輸出結果
TASK [debug] *************************************************************************************
ok: [web1] => {
    "say_hi.stdout_lines[0]": "hello world"
}

再看下面一段json數據

"ipv6": [
   {
       "address": "fe80::20c:29ff:fe26:1498", 
       "prefix": "64", 
       "scope": "link"
   }
]

# 其中key=ipv6,其內有且僅有一個列表項,但該列表內包含了數個字典項。要引用列表內的字典,例如上面的address項。應該如下引用:
ipv6[0].address

5.2.3. 引用facts數據

既然已經了解了json數據中的字典和列表項的引用方式,顯然facts中的一大堆數據就能引用並排上用場。例如以下是一段facts數據。

[root@localhost ~]# ansible localhost -m setup -a 'filter="*ens32*"'
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_ens32": {
            "active": true,
            "device": "ens32",
            "features": {
                "busy_poll": "off [fixed]",
                "fcoe_mtu": "off [fixed]",
                "generic_receive_offload": "on",
                ·····························
            },
            "ipv4": {
                "address": "10.0.0.12",
                "broadcast": "10.0.0.255",
                "netmask": "255.255.255.0",
                "network": "10.0.0.0"
            },  
            ·····························

            "macaddress": "00:0c:29:b1:91:9e",
            "module": "e1000",
            ·····························
    },
    "changed": false
}

顯然,facts數據的頂級key為ansible_facts,在引用時應該將其包含在變量表達式中。但自動收集的facts比較特殊,它以ansible_facts作為key,ansible每次收集后會自動將其注冊為變量,所facts中的數據都可以直接通過變量引用,甚至連頂級keyansible_facts都要省略。

例如引用上面的ipv4的地址address項

ansible_ens32.ipv4.address

# 不能寫成
ansible_facts.ansible_ens32.ipv4.address
其他任意時候,都應該帶上所有的key

5.3. 設置本地facts

在ansible收集facts時,還會自動收集/etc/ansible/facts.d/*.fact文件中的數據到facts中,且以ansible_local作為key。目前fact支持兩種類型的文件:ini和json。當然,如果fact文件的json或ini格式寫錯了導致無法解析,那么肯定也無法收集。

例如:在/etc/ansible/facts.d目錄下存在一個my.fact的文件,其內數據如下:

[root@localhost ~]# cat /etc/ansible/facts.d/my.fact
{
    "family": {
        "father": {
            "name": "Zhangsan",
            "age": "39"
        },
        "mother": {
            "name": "Lisi",
            "age": "35"
        }
    }
}

# ansible收集facts后的本地facts數據如下:
[root@localhost ~]# ansible localhost -m setup -a 'filter=ansible_local'
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_local": {
            "my": {
                "family": {
                    "father": {
                        "age": "39",
                        "name": "Zhangsan"
                    },
                    "mother": {
                        "age": "35",
                        "name": "Lisi"
                    }
                }
            }
        }
    },
    "changed": false
}


# 可見,如果想要引用本地文件中的某個key,除了帶上ansible_local外,還必須帶上fact文件的文件名,例如,引用father的name
ansible_local.my.family.father.name

5.4. 輸出和引用變量

上文已經展示了一種變量的引用方式:使用debug的var參數。debug的另一個參數msg也能輸出變量,且msg可以輸出自定義信息,而var參數只能輸出變量。

另外,msg和var引用參數的方式有所不同。例如:

[root@localhost ansible]# cat test2.yml
---
    - hosts: localhost
      tasks:
        - debug: 'msg="ipv4 adress: {{ ansible_ens32.ipv4.address }}"'
        - debug: var=ansible_ens32.ipv4.address

# 輸出結果部分截取如下:
TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "ipv4 adress: 10.0.0.12"
}

TASK [debug] *******************************************************************
ok: [localhost] => {
    "ansible_ens32.ipv4.address": "10.0.0.12"
}

msg引用變量需要加上雙大括號,既然加了大括號,為了防止被解析為內聯字典,還得加引號包圍。這里使用了兩段引號,因為其內還包括了一個":",加引號可以防止它被解析為"key: "的格式。而var參數引用變量則直接指定變量名。

這就像bash中引用變量的方式是一樣的,有些時候需要加上$,有時候不能加$。也就是說,當引用的是變量的值,就需要加雙大括號,就像加$一樣,而引用變量本身,則不能加雙大括號。其實雙大括號就是jinja2中的分隔符。

幾乎所有地方都可以引用變量,例如循環、when語句 、信息輸出語句、template文件等等。只不過有些地方不能使用雙大括號,有些地方需要使用。

5.5. 注冊和定義變量的各種方式

ansible中定義變量的方式有很多種,大致有:

  • 將模塊的執行結果注冊為變量;
  • 直接定義字典類型的變量;
  • role中文件內定義變量;
  • 命令行傳遞變量;
  • 借助with_items迭代將多個task的結果賦值給一個變量;
  • inventory中的主機或主機組變量;
  • 內置變量。

5.5.1. register注冊變量

使用register選項,可以將當前task的輸出結果賦值給一個變量。例如:下面的示例中將echo的結果“haha”賦值給say_hi變量。主義,模塊的輸出結果是json格式的,所以,引用變量時要指定引用的對象。

[root@localhost ansible]# cat test3.yml
---
    - hosts: web1
      tasks:
        - shell: echo haha
          register: say_hi
        - debug: var=say_hi.stdout

# 截取輸出結果
TASK [debug] *************************************************************************************
ok: [web1] => {
    "say_hi.stdout": "haha"
}

5.5.2. set_fact定義變量

set_fact和register的功能很相似,也是將值賦值給變量。它更像shell中變量的賦值方式,可以將某個變量的值賦值給另一個變量,也可以將字符串賦值給變量。

[root@localhost ansible]# cat test4.yml
---
    - hosts: web1
      tasks:
        - shell: echo haha
          register: say_hi
        - set_fact: var1="{{say_hi.stdout}}"
        - set_fact: var2="your name is"
        - debug: msg="{{var2}} {{var1}}"
        
# 截取輸出結果
TASK [debug] *************************************************************************************
ok: [web1] => {
    "msg": "your name is haha"
}

5.5.3. vars定義變量

可以在play或task層次使用vars定義字典型變量。如果同名,則task層次的變量覆蓋play層次的變量。

[root@localhost ansible]# cat test5.yml
---
    - hosts: web1
      vars:
        var1: value1
        var2: value2
      tasks:
        - debug: msg="{{var1}} {{var2}}"
          vars:
            var2: value2.2

# 截取輸出結果
TASK [debug] *************************************************************************************
ok: [web1] => {
    "msg": "value1 value2.2"
}

5.5.4. vars_files定義變量

和vars一樣,只不過它是將變量以字典格式定義在獨立的文件中,且vars_files不能定義在task層次,只能定義在play層次

[root@localhost ansible]# cat test6.yml
---
    - hosts: web1
      vars_files:
        - /tmp/var_file1.yml
        - var_file2.yml
      tasks:
        - debug: msg="{{var1}} {{var2}}"

# 上面var_file2.yml 使用的是相對路徑,基於playbook所在的路徑。
# 例如,該playbook為/tmp/xx.yml,則var_file2.yml也應該在/tmp下。當然,也可以使用絕對路徑。

5.5.5. roles中的變量

由於role是整合playbook的,它有默認的文件組織結構。其中有一個目錄vars,其內的main.yml用於定義變量。還有defaults目錄內的main.yml則是定義role默認變量的,默認變量的優先級最低。

[root@localhost ansible]# tree yaml/
/yaml
├── roles
│   └── nginx
│       ├── defaults
│           └── main.yml      
│       ├── files
│       ├── handlers
│       ├── meta
│       ├── tasks
│       ├── templates
│       └── vars
│           └── main.yml
└── site.yml

# main.yml中變量定義方式也是字典格式,例如:
---
    mysql_port: 3306

5.5.6. 命令行傳遞變量

ansible和ansible-playbook命令的"-e"選項都可以傳遞變量,傳遞的方式有兩種: -e key=value 和 -e @var_file 。注意,當key=value方式傳遞變量時,如果變量中包含特殊字符,必須防止其被shell解析。

例如:

[root@localhost ~]# ansible localhost -m shell -a "echo {{say_hi}}" -e 'say_hi="hello world"'
localhost | CHANGED | rc=0 >>
hello world

[root@localhost ~]# ansible localhost -m shell -a "echo {{say_hi}}" -e @/tmp/var_file1.yml
localhost | CHANGED | rc=0 >>
hello world

# /tmp/var_file1.yml內容如下:
[root@localhost ~]# cat /tmp/var_file1.yml
---
    say_hi: hello world

5.5.7. 借助with_items疊加變量

ansible中可以借助with_items實現列表迭代的功能,作用於變量注冊的行為上,就可以實現將多個結果賦值給同一個變量。

例如下面的playbook中,給出了3個item列表,並在shell模塊中通過固定變量"{{item}}"分別迭代,第一次迭代的是haha,第二次迭代的是heihei,第三次迭代的是hehe,也就實現了3次循環。最后,將結果注冊為變量hi_var

[root@localhost ansible]# cat test7.yml
---
    - hosts: web1
      remote_user: root
      tasks:
        - name: test
          shell: echo "{{item}}"
          with_items:
            - haha
            - heihei
            - hehe
          register: hi_var
        - debug: var=hi_var.results[0].stdout
        - debug: var=hi_var.results[1].stdout
        - debug: var=hi_var.results[2].stdout

# 部分輸出截取:
TASK [test] **********************************************************************************************
changed: [web1] => (item=haha)
changed: [web1] => (item=heihei)
changed: [web1] => (item=hehe)

TASK [debug] *********************************************************************************************
ok: [web1] => {
    "hi_var.results[0].stdout": "haha"
}

TASK [debug] *********************************************************************************************
ok: [web1] => {
    "hi_var.results[1].stdout": "heihei"
}

TASK [debug] *********************************************************************************************
ok: [web1] => {
    "hi_var.results[2].stdout": "hehe"
}

每次迭代的過程中,調用item的模塊都會將結果保存在一個key為results的數組中。因此,引用迭代后注冊的變量時,需要在變量名中加上results,並指定數組名。例如上面的hi_var.results[N].stdout

還可以使用for循環遍歷列表。例如:

- debug: msg="{% for i in hi_var.results %} {{i.stdout}} {% endfor %}"

# 截取部分輸出結果
TASK [test] **************************************************************************************************
changed: [web1] => (item=haha)
changed: [web1] => (item=heihei)
changed: [web1] => (item=hehe)

TASK [debug] *************************************************************************************************
ok: [web1] => {
    "msg": " haha  heihei  hehe "
}

為了方便理解,查看一下hi_var的輸出結果,下面是hi_var的第一個列表的輸出:

- debug: msg="{{hi_var.results[0]}}"

# 截取輸出結果
TASK [debug] *************************************************************************************************
ok: [web1] => {
    "msg": {
        "ansible_loop_var": "item",
        "changed": true,
        "cmd": "echo \"haha\"",
        "delta": "0:00:00.160403",
        "end": "2020-02-26 12:03:20.157947",
        "failed": false,
        "invocation": {
            "module_args": {
                "_raw_params": "echo \"haha\"",
                "_uses_shell": true,
                "argv": null,
                "chdir": null,
                "creates": null,
                "executable": null,
                "removes": null,
                "stdin": null,
                "stdin_add_newline": true,
                "strip_empty_ends": true,
                "warn": true
            }
        },
        "item": "haha",
        "rc": 0,
        "start": "2020-02-26 12:03:19.997544",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "haha",
        "stdout_lines": [
            "haha"
        ]
    }
}

5.5.8.

inventory中主機變量和主機組變量,不僅包括內置變量賦值,還包括自定義變量賦值。
例如:

web1 ansible_ssh_port=22 var1=1
[centos7]
web1 var1=2
web2
[centos7vars]
var1=2.2
var2=3
[all:vars]
var2=4

其中ansible_ssh_port是主機內置變量,為其賦值22.這類變量是設置類變量,不能被引用。此外還在多處為主機web進行了賦值。其中[centos7:vars]和[all:vars]表示為主機組賦值,前者是為centos7這個組復制,后者是為所有組賦值。

以下是執行語句:

[root@localhost ~]# ansible web1 -m shell -a 'echo "{{var1}} {{var2}}"'
web1 | CHANGED | rc=0 >>
2 3

從結果可知,主機變量優先級 > 主機組變量。給定的主機組變量優先級 > all特殊組。

除了在inventory文件路徑為/etc/ansible/hosts,playbook文件路徑為/tmp/xx.yml,則主機web和主機組centos7的變量文件路徑可以為以下幾種:

  • /etc/ansible/host_vars/web1
  • /etc/ansible/group_vars/centos7
  • /tmp/host_vars/web1
  • /tmp/group_vars/centos7

以下為幾個host_vars和group_vars目錄下的文件內容

[root@localhost ~]# cat /etc/ansible/{host_vars/web1,group_vars/centos7} /tmp/{host_vars/web1,group_vars/centos7}
var1: 1
var2: 2
var3: 3
var4: 4

# 以下為/tmp/testweb1.yml內容
[root@localhost ~]# cat /tmp/testweb.yml
---
    - hosts: web1
      tasks:
        - debug: msg='{{var1}} {{var2}} {{var3}} {{var4}}'

# 執行結果部分截取如下:
TASK [debug] *************************************************************************************************
ok: [web1] => {
    "msg": "1 2 3 4"
}

5.5.9. 內置變量

ansible除了inventory中內置的一堆不可被引用的設置類變量,還有幾個全局都可以引用的內置變量,主要有以下幾個:

inventory_hostname
inventory_hostname_short
groups
group_names
hostvars
play_hosts
inventory_dir
ansible_versino
  • inventory_hostname和inventory_hostname_short
  • 分別代表的是inventory中被控節點的主機名和主機名的第一部分,如果定義的是主機別名,則變量的值也是別名。
# 例如inventory中centos7主機組定義為如下:
[centos7]
192.168.1.60
web1 ansible_ssh_host=192.168.1.61
www.web2.com ansible_ssh_host=192.168.1.62

# 分別輸出它們的inventory_hostname和inventory_hostname_short
[root@localhost ~]# ansible centos7 -m debug -a 'msg="{{inventory_hostname}} & {{ inventory_hostname_short}}"'
192.168.1.60 | SUCCESS => {
    "msg": "192.168.1.60 & 192"
}
web1 | SUCCESS => {
    "msg": "web1 & web1"
}
www.web2.com | SUCCESS => {
    "msg": "www.web2.com & www"
}

  • groups和goup_names
  • group_names返回的事主機所屬主機組,如果該主機在多個組中,則返回多個組,如果它不在組中,則返回ungrouped這個特殊組:
# 例如,某個inventory文件如下:
[root@localhost ~]# cat /tmp/ansible_hosts
192.168.1.11
192.168.1.12
192.168.1.13
192.168.1.14
[centos6]
192.168.1.11
[centos7]
192.168.1.12
web1 ansible_ssh_host=192.168.1.13
www.web2.com ansible_ssh_host=192.168.1.14
[centos:children]
centos6
centos7

其中:11 定義在centos6 和centos 中,所以返回這兩個組;

[root@localhost ~]# ansible -i /tmp/ansible_hosts 192.168.1.11 -m debug -a 'msg="{{group_names}}"'
192.168.1.11 | SUCCESS => {
    "msg": [
        "centos",
        "centos6"
    ]
}

同理,12 返回centos7 和centos ;

[root@localhost ~]# ansible -i /tmp/ansible_hosts 192.168.1.12 -m debug -a 'msg="{{group_names}}"'
192.168.1.12 | SUCCESS => {
    "msg": [
        "centos",
        "centos7"
    ]
}

13,14 則返回ungrouped,雖然它們在centos7 中都定義了別名,但至少將13,14 作為主機名時,它們不在任何主機組中;

[root@localhost ~]# ansible -i /tmp/ansible_hosts 192.168.1.13 -m debug -a 'msg="{{group_names}}"'
192.168.1.13 | SUCCESS => {
    "msg": [
        "ungrouped"
    ]
}
[root@localhost ~]# ansible -i /tmp/ansible_hosts 192.168.1.14 -m debug -a 'msg="{{group_names}}"'
192.168.1.14 | SUCCESS => {
    "msg": [
        "ungrouped"
    ]
}

另一方面,web1 和www.web2.com 這兩個別名主機都返回centos7 和centos 兩個組;

[root@localhost ~]# ansible -i /tmp/ansible_hosts web1 -m debug -a 'msg="{{group_names}}"'
web1 | SUCCESS => {
    "msg": [
        "centos",
        "centos7"
    ]
}
[root@localhost ~]# ansible -i /tmp/ansible_hosts www.web2.com -m debug -a 'msg="{{group_names}}"'
www.web2.com | SUCCESS => {
    "msg": [
        "centos",
        "centos7"
    ]
}
  • groups變量則返回其所在inventory文件中所有組合其內主機名。注意,該變量對每個控制節點都返回一次,所以返回的內容可能非常多。
  • 例如,上面的inventory中,如果指定被控節點為centos7,則會重復返回3次(因為有3台被控主機)在該inventory文件。其中的第三台主機www.web2.com的返回結果為:
[root@localhost ~]# ansible -i /tmp/ansible_hosts www.web2.com -m debug -a 'msg="{{groups}}"'
www.web2.com | SUCCESS => {
    "msg": {
        "all": [
            "192.168.1.13",
            "192.168.1.14",
            "192.168.1.11",
            "192.168.1.12",
            "web1",
            "www.web2.com"
        ],
        "centos": [
            "192.168.1.11",
            "192.168.1.12",
            "web1",
            "www.web2.com"
        ],
        "centos6": [
            "192.168.1.11"
        ],
        "centos7": [
            "192.168.1.12",
            "web1",
            "www.web2.com"
        ],
        "ungrouped": [
            "192.168.1.13",
            "192.168.1.14"
        ]
    }
}
  • hostvars
  • 該變量用於引用其他主機上手機的facts中的數據,或者引用其他主機的主機變量、主機組變量。其key為主機名或主機組名。
  • 舉個例子,假如使用ansible部署一台php服務器host1,且配置文件內需要指向另一台數據庫服務器host2的ip地址iP2,可以直接在配置文件中指定ip2。但也可以在模板配置文件中直接引用host2收集的facts數據中的ansible_eth0.ipv4.addree變量

例如:centos7主機組中包含了192.168.1.[60:62]共3台主機。playbook內容如下:

---
    - hosts: centos7
      tasks:
        - debug: msg="{{hostvars['192.168.1.61'].ansible_ens34.ipv4.address}}"

# 執行結果部分截取如下:
TASK [debug] *************************************************************************************************
ok: [192.168.1.60] => {
    "msg": "192.168.1.61"
}
ok: [192.168.1.61] => {
    "msg": "192.168.1.61"
}
ok: [192.168.1.62] => {
    "msg": "192.168.1.61"
}

但注意:在引用其他主機facts中數據時,要求被引用主機進行了facts收集動作,或者有facts緩存。否則都沒手機,當然無法引用其facts數據。也就是說,當被引用主機沒有facts緩存時,ansible的控制節點中必須同時包含引用主機和被引用主機。

除了引用其他主機的facts數據,還可以引用其他主機的主機變量和主機組變量,且不要求被引用主機有facts刪數據,因為主機變量和主機組變量是在ansible執行任務前加載的。

例如,

# inventory中格式如下:
192.168.1.11
[centos7]
192.168.1.12 var12=12
192.168.1.13
[centos7:vars]
var13:13

# playbook內容如下:
---
    - hosts: 192.168.1.11
      tasks:
        - debug: msg="{{hostvars['192.168.1.12'].var12}} & {{hostvars['192.168.1.13'].var13}}"
        
# 執行結果截取如下:
TASK [debug] ***************************************
ok: [192.168.1.11] => {
    "msg": "12 & 13"
}
  • play_hosts和inventory_dir
  • play_hosts代表的是當前play所涉及inventory內的所有主機名列表。

例如:

# inventory內容為:
192.168.1.11
[centos6]
192.168.1.12
192.168.1.13
[centos7]
192.168.1.14
192.168.1.15

# 那么,該inventory內的任意一或多台主機作為ansible或ansible-playbook的被控節點時,都會返回整個inventory內的所有主機名稱;
# inventory_dir是所使用inventory所在的目錄
  • ansible_version
  • 代表的是ansible軟件的版本號,變量返回的內容如下:
{
        "full": "2.3.1.0", 
        "major": 2, 
        "minor": 3, 
        "revision": 1, 
        "string": "2.3.1.0"
    }


免責聲明!

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



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