Ansible 魔术变量的列表和内容
以下是在 Ansible Playbook 中可以使用的魔术变量。
由于公式文档中没有列表,我试着将其制作成了一个列表。
魔术变量是指
在Ansible Playbook中,有一些变量可以在使用 “gather_facts: False” 的情况下使用。
它被称为预定义变量,并被称为魔术变量。
主要可以获得与库存相关的信息。
- Ansible doc | Magic Variables
魔术变量清单
值是根据每台正在运行Playbook的目标机器进行设置的。
group_names
このターゲットマシンが属する全グループの一覧groups
グループ-to-ホストのマッピングinventory_hostname
インベントリに書かれたホスト名inventory_hostname_short
inventory_hostname
の最初の “.” までplay_hosts
Playbookが適用されるホスト一覧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 }}`,可以构建完整的路径。
为了事实而设定的神奇变量。
重要的魔法变量。
hostvars
Playbookを適用する全マシンの facts の集合如果gather_facts为true,则hostvars中包含执行Playbook的所有机器的facts。
如果 gather_facts 的值为 False,则该值将为空(而不是未定义)。
当使用{{ hostvars[“主机名”] }}来引用hostvars时,似乎会在引用时添加以下成员。
然而,在文件中找不到任何描述。
是根据规格书还是偶然发生的情况,如果要使用的话,最好还是向原厂询问一下以防万一。
预约过的魔术变量
这个值为空。这是一个用户不应该使用的变量。
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可能会更方便,同时还能保持操作的流畅性。