美文网首页
Ansible魔法变量

Ansible魔法变量

作者: Odven | 来源:发表于2020-08-31 17:23 被阅读0次

    1. 魔法变量

    1. hostvars
    2. inventory_hostname
    3. inventory_hostname_short
    4. groups
    5. group_names
    

    2. Ansible默认会提供一些内置的变量以实现一些特定的功能,我们称之为魔法变量。下面列举一些常用的魔法变量。

    1. hostvars
    该变量用于引用其他主机上收集的facts中的数据,或者引用其他主机的主机变量、主机组变量。其key为主机名或主机组名。
    
    举个例子,假如使用ansible部署一台php服务器host1,且配置文件内需要指向另一台数据库服务器host2的ip地址ip2,可以直接在配置文件中指定ip2,
    但也可以在模板配置文件中直接引用host2收集的facts数据中的ansible_eth0.ipv4.address变量。
    例如,centos7主机组中包含了192.168.100.[63:65]共3台主机。playbook内容如下:
    ---
    - hosts: centos7
      tasks:
        - debug: msg="{{hostvars['192.168.100.63'].ansible_eth0.ipv4.address}}"
    
    # 执行结果
    TASK [debug] *********************************************************
    ok: [192.168.100.63] => {
        "msg": "192.168.100.63"
    }
    ok: [192.168.100.64] => {
        "msg": "192.168.100.63"
    }
    ok: [192.168.100.65] => {
        "msg": "192.168.100.63"
    }
    但注意,在引用其他主机facts中数据时,要求被引用主机进行了facts收集动作,或者有facts缓存。否则都没收集,
    当然无法引用其facts数据。也就是说,当被引用主机没有facts缓存时,ansible的控制节点中必须同时包含引用主机和被引用主机。
    
    除了引用其他主机的facts数据,还可以引用其他主机的主机变量和主机组变量,
    且不要求被引用主机有facts数据,因为主机变量和主机组变量是在ansible执行任务前加载的。
    例如,inventory中格式如下:
    192.168.100.59
    [centos7]
    192.168.100.63 var63=63
    192.168.100.64
    192.168.100.65
    [centos7:vars]
    var64=64
    
    # playbook内容如下:
    ---
    - hosts: 192.168.100.59
      tasks:
        - debug: msg="{{hostvars['192.168.100.63'].var63}} & {{hostvars['192.168.100.65'].var64}}"
    
    # 执行结果
    TASK [debug] ***************************************
    ok: [192.168.100.59] => {
        "msg": "63 & 64"
    }
    
    
    2. inventory_hostname和inventory_hostname_short
    分表代表的是inventory中被控节点的主机名和主机名的第一部分,如果定义的是主机别名,则变量的值也是别名。
    例如inventory中centos7主机组定义为如下:
    [centos7]
    192.168.100.63
    host1 ansible_ssh_host=192.168.100.64
    www.host2.com ansible_ssh_host=192.168.100.65
    
    分别输出它们的inventory_hostname和inventory_hostname_short。
    shell> ansible centos7 -m debug -a 'msg="{{inventory_hostname}} & {{inventory_hostname_short}}"'
    192.168.100.63 | SUCCESS => {
        "msg": "192.168.100.63 & 192"
    }
    host1 | SUCCESS => {
        "msg": "host1 & host1"
    }
    www.host2.com | SUCCESS => {
        "msg": "www.host2.com & www"
    }
    
    
    
    3. groups和group_names
    group_names返回的是主机所属主机组,如果该主机在多个组中,则返回多个组,如果它不在组中,则返回ungrouped这个特殊组。
    例如,某个inventory文件如下:
    192.168.100.60
    192.168.100.63
    192.168.100.64
    192.168.100.65
    [centos6]
    192.168.100.60
    [centos7]
    192.168.100.63
    host1 ansible_ssh_host=192.168.100.64
    www.host2.com ansible_ssh_host=192.168.100.65
    [centos:children]
    centos6
    centos7
    
    其中100.60定义在centos6和centos中,所以返回这两个组。同理100.63返回centos7和centos。100.64和100.65则返回ungrouped,虽然它们在centos7中都定义了别名,但至少将100.64和100.65作为主机名时,它们是不在任何主机中的。另一方面,host1和www.host2.com这两个别名主机都返回centos7和centos两个组。
    
    groups变量则是返回其所在inventory文件中所有组和其内主机名。注意,该变量对每个控制节点都返回一次,所以返回的内容可能非常多。例如,上面的inventory中,如果指定被控节点为centos7,则会重复返回3次(因为有3台被控主机)该inventory文件。其中的第三台主机www.host2.com的返回结果为:
    # 执行结果
    www.host2.com | SUCCESS => {
    "msg": {
        "all": [
            "192.168.100.60",
            "192.168.100.63",
            "192.168.100.64",
            "192.168.100.65",
            "host1",
            "www.host2.com"
        ],
        "centos": [
            "192.168.100.60",
            "192.168.100.63",
            "host1",
            "www.host2.com"
        ],
        "centos6": [
            "192.168.100.60"
        ],
        "centos7": [
            "192.168.100.63",
            "host1",
            "www.host2.com"
        ],
        "ungrouped": [
            "192.168.100.60",
            "192.168.100.63",
            "192.168.100.64",
            "192.168.100.65"
        ]
    }
    }
    

    该文引荐于: https://www.bbsmax.com/A/ke5jmbxOJr/

    相关文章

      网友评论

          本文标题:Ansible魔法变量

          本文链接:https://www.haomeiwen.com/subject/shousktx.html