Ansible 魔术变量的列表和内容

以下是在 Ansible Playbook 中可以使用的魔术变量。

由于公式文档中没有列表,我试着将其制作成了一个列表。

魔术变量是指

在Ansible Playbook中,有一些变量可以在使用 “gather_facts: False” 的情况下使用。

它被称为预定义变量,并被称为魔术变量。

主要可以获得与库存相关的信息。

    Ansible doc | Magic Variables

魔术变量清单

值是根据每台正在运行Playbook的目标机器进行设置的。

変数名内容group_namesこのターゲットマシンが属する全グループの一覧groupsグループ-to-ホストのマッピングinventory_hostnameインベントリに書かれたホスト名inventory_hostname_shortinventory_hostnameの最初の “.” までplay_hostsPlaybookが適用されるホスト一覧inventory_dirインベントリファイルのあるディレクトリパスinventory_fileインベントリファイルのベース名

groups会扁平地展开群组层次结构(群组的群组)。

    グループX:[ ホスト1, ホスト2, ... ]
    グループY:[ ホスト1, ホスト2, ホスト3, ... ]

以类似的形式,持有着值。

inventory_hostname_short 是 inventory_hostname 的简化版本,它将 inventory_hostname 视为完全限定域名(FQDN)并删除了域名部分,得到了主机名。然而,对于 IPv4 地址 xx.yy.zz.ww,它会变成 “xx”。为了避免可能产生的意想不到的错误,最好不要使用它。

通过将 `inventory_{dir,file}` 设置为 `{{ inventory_dir ~ “/” ~ inventory_file }}`,可以构建完整的路径。

为了事实而设定的神奇变量。

重要的魔法变量。

変数名内容hostvarsPlaybookを適用する全マシンの facts の集合

如果gather_facts为true,则hostvars中包含执行Playbook的所有机器的facts。

如果 gather_facts 的值为 False,则该值将为空(而不是未定义)。

当使用{{ hostvars[“主机名”] }}来引用hostvars时,似乎会在引用时添加以下成员。

追加されるメンバ内容ansible_connectionsshやlocalなどコネクションタイプgroup_name前述のマジック変数inventory_hostname前述のマジック変数inventory_hostname_short前述のマジック変数

然而,在文件中找不到任何描述。

是根据规格书还是偶然发生的情况,如果要使用的话,最好还是向原厂询问一下以防万一。

预约过的魔术变量

这个值为空。这是一个用户不应该使用的变量。

変数名内容environment予約済み変数

实际获得的值

我写了一个小Playbook并尝试检查魔术变量的值。

为了观察groups的动态,我在存储中定义的组被强行分层。就是这个意思。

    test-servers
        +---- test-servers1
        |         +---- localhost1
        |
        +---- test-servers2
                  +---- localhost2

执行结果

首先,从可以获得的值来展示。

正在运行gather_facts:False。

[ansibleman@ponet ~]$ ansible-playbook -i hosts magic_vars.yml

PLAY [test-servers] ***********************************************************

TASK: [Facts | ansible_hostname] **********************************************
ok: [localhost1] => {
    "ansible_hostname": "{{ ansible_hostname }}"
}
ok: [localhost2] => {
    "ansible_hostname": "{{ ansible_hostname }}"
}

TASK: [Facts | ansible_default_ipv4] ******************************************
ok: [localhost1] => {
    "ansible_default_ipv4": "{{ ansible_default_ipv4 }}"
}
ok: [localhost2] => {
    "ansible_default_ipv4": "{{ ansible_default_ipv4 }}"
}

TASK: [Facts | ansible_env] ***************************************************
ok: [localhost1] => {
    "ansible_env": "{{ ansible_env }}"
}
ok: [localhost2] => {
    "ansible_env": "{{ ansible_env }}"
}

TASK: [Magic | group_names] ***************************************************
ok: [localhost1] => {
    "group_names": [
        "test-servers",
        "test-servers1"
    ]
}
ok: [localhost2] => {
    "group_names": [
        "test-servers",
        "test-servers2"
    ]
}

TASK: [Magic | groups] ********************************************************
ok: [localhost1] => {
    "groups": {
        "all": [
            "localhost1",
            "localhost2"
        ],
        "test-servers": [
            "localhost1",
            "localhost2"
        ],
        "test-servers1": [
            "localhost1"
        ],
        "test-servers2": [
            "localhost2"
        ],
        "ungrouped": []
    }
}
ok: [localhost2] => {
    "groups": {
        "all": [
            "localhost1",
            "localhost2"
        ],
        "test-servers": [
            "localhost1",
            "localhost2"
        ],
        "test-servers1": [
            "localhost1"
        ],
        "test-servers2": [
            "localhost2"
        ],
        "ungrouped": []
    }
}

TASK: [Magic | inventory_hostname] ********************************************
ok: [localhost1] => {
    "inventory_hostname": "localhost1"
}
ok: [localhost2] => {
    "inventory_hostname": "localhost2"
}

TASK: [Magic | inventory_hostname_short] **************************************
ok: [localhost1] => {
    "inventory_hostname_short": "localhost1"
}
ok: [localhost2] => {
    "inventory_hostname_short": "localhost2"
}

TASK: [Magic | play_hosts] ****************************************************
ok: [localhost1] => {
    "play_hosts": [
        "localhost1",
        "localhost2"
    ]
}
ok: [localhost2] => {
    "play_hosts": [
        "localhost1",
        "localhost2"
    ]
}

TASK: [Magic | inventory_dir] *************************************************
ok: [localhost1] => {
    "inventory_dir": "/home/ansibleman"
}
ok: [localhost2] => {
    "inventory_dir": "/home/ansibleman"
}

TASK: [Magic | inventory_file] ************************************************
ok: [localhost1] => {
    "inventory_file": "hosts"
}
ok: [localhost2] => {
    "inventory_file": "hosts"
}

TASK: [Magic for Facts | hostvars] ********************************************
ok: [localhost1] => {
    "hostvars": {
        "localhost1": {},
        "localhost2": {}
    }
}
ok: [localhost2] => {
    "hostvars": {
        "localhost1": {},
        "localhost2": {}
    }
}

TASK: [Reserved | environment] ************************************************
ok: [localhost1] => {
    "environment": {}
}
ok: [localhost2] => {
    "environment": {}
}

PLAY RECAP ********************************************************************
localhost1                 : ok=12   changed=0    unreachable=0    failed=0
localhost2                 : ok=12   changed=0    unreachable=0    failed=0

一些解释

    • Factsは、gather_facts:False にしたので、未定義変数の状態。debugモジュールでは、未定義変数は文字列として処理される。

 

    • group_name では、localhost1 と localhost2 で、ちゃんと別々のグループ一覧を取得できている。

 

    play_hosts では、Playbookを実行する全ターゲットマシン名を取得できている。

虽然稍微偏离主题,但ansible_hostname将成为目标机器的真实主机名。它是Facts中的一个参数,当gather_facts:True时,在目标机器上正确获取并传入正确的值。

战略规划书

为了获得以上结果,写下来的Playbook在这里。

--- # file: magic_vars.yml
- hosts: test-servers

  gather_facts: "{{ check_env | default(False) }}"

  tasks:

    # Facts
    - name: Facts | ansible_hostname
      debug: var=ansible_hostname
    - name: Facts | ansible_default_ipv4
      debug: var=ansible_default_ipv4
    - name: Facts | ansible_env
      debug: var=ansible_env

    # Magic variables
    - name: Magic | group_names
      debug: var=group_names
    - name: Magic | groups
      debug: var=groups
    - name: Magic | inventory_hostname
      debug: var=inventory_hostname
    - name: Magic | inventory_hostname_short
      debug: var=inventory_hostname_short
    - name: Magic | play_hosts
      debug: var=play_hosts
    - name: Magic | inventory_dir
      debug: var=inventory_dir
    - name: Magic | inventory_file
      debug: var=inventory_file

    # Magic variable for Facts
    - name: Magic for Facts | hostvars
      debug: var=hostvars

    # Reserved magic variable
    - name: Reserved | environment
      debug: var=environment

如果通过命令行的 -e 选项为 check_env 变量赋值,即使不对 Playbook 进行修改,也可以控制 gather_facts:。

请按照以下方式执行。

ansible-playbook -i hosts magic_vars.yml

当我们想收集事实时,可以这样做。

ansible-playbook -i hosts magic_vars.yml -e "check_env=True"

库存和/etc/hosts

这里是被用于的库存文件。

[test-servers1]
localhost1  ansible_connection=local

[test-servers2]
localhost2  ansible_connection=local

[test-servers:children]
test-servers1
test-servers2

在/etc/hosts文件中,将主机名与IP地址在清单中进行对应。

127.0.0.1   localhost localhost.localdomain
127.0.0.1   localhost1
127.0.0.1   localhost2

批量设置主机名

使用清单上写着的主机名,在所有目标机器上进行批量设置主机名的尝试。

--- # file: set_hostname.yml
- hosts: test-servers
  gather_facts: False
  tasks:
    - name: Set the hostname using the inventory
      hostname: name={{ inventory_hostname }}
      sudo: yes

在清单中写下的主机名,需要在/etc/hosts等文件中进行注册,并与相应的IP地址对应。

以这种方式执行。

    $ ansible-playbook -i hosts set_hostname.yml

当要启动和进行初始设置大量虚拟机时,设置为gather_facts:False可能会更方便,同时还能保持操作的流畅性。

广告
将在 10 秒后关闭
bannerAds