如何在 Ansible 中使用 host_vars?

Mia*_*ian 3 ansible

我在中创建了一个变量group_vars

组变量/全部

---
hostname: name1
Run Code Online (Sandbox Code Playgroud)

我想将 name2 设置为真实主机(10.20.30.40),所以我创建了一个文件并在那里再次设置主机名

主机变量/10.20.30.40

---
hostname: name2
Run Code Online (Sandbox Code Playgroud)

当我运行剧本时,它返回 name1 但不返回 name2:

角色/操作系统/任务/main.yml

- name: Print hostname
  ansible.builtin.debug:
    msg: "{{ hostname }}"
Run Code Online (Sandbox Code Playgroud)

结果:

TASK [server : Print hostname] *************************************
ok: [web_server] => {
    "msg": "name1"
}
Run Code Online (Sandbox Code Playgroud)

我想在每个要更新的主机中设置变量,这不是正确的用法吗?


而且,如果我在文件夹下以这种方式命名主机文件host_vars,它可以工作吗?

web_server

库存:

[web_server]
10.20.30.40
Run Code Online (Sandbox Code Playgroud)

剧本:

---
- hosts: web_server
  become: true
  vars_files:
    - group_vars/all
  roles:
    - os
Run Code Online (Sandbox Code Playgroud)

Vla*_*tka 7

问:当我运行 playbook 时,它返回 name1,但不返回 name2。

shell> cat hosts
[web_server]
10.20.30.40
Run Code Online (Sandbox Code Playgroud)
shell> cat group_vars/all
---
hostname: name1
Run Code Online (Sandbox Code Playgroud)
shell> cat host_vars/10.20.30.40 
---
hostname: name2
Run Code Online (Sandbox Code Playgroud)
shell> cat playbook.yml
---
- hosts: web_server
  vars_files:
    - group_vars/all
  tasks:
    - debug:
        var: hostname
Run Code Online (Sandbox Code Playgroud)

答:不要将group_vars/all包含在剧本中。

playbook 的group_vars/all会自动以优先级 5 包含在 playbook 中。请参阅了解变量优先级。如果将group_vars/all放入vars_files (优先级 14)中,则会覆盖host_vars(优先级 10)。


例子。鉴于库存

shell> cat hosts
[web_server]
10.20.30.40
10.20.30.41
Run Code Online (Sandbox Code Playgroud)

剧本

shell> cat playbook.yml
---
- hosts: web_server
  gather_facts: false
  tasks:
    - debug:
        var: hostname
Run Code Online (Sandbox Code Playgroud)

按预期给出

shell> ansible-playbook -i hosts playbook.yml 

PLAY [web_server] *********************************************************

TASK [debug] **************************************************************
ok: [10.20.30.40] => 
  hostname: name2
ok: [10.20.30.41] => 
  hostname: name1
Run Code Online (Sandbox Code Playgroud)

中的变量host_vars/10.20.30.40覆盖中的变量group_vars/all