首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以通配符为host_vars目录吗?

可以通配符为host_vars目录吗?
EN

Stack Overflow用户
提问于 2020-06-25 08:22:52
回答 1查看 885关注 0票数 4

长话短说:我已经建立了一个家庭实验室,在那里我使用Ansible和VMware动态库存插件。为了区分不同的VM,插件将uid添加到主机名,例如:unique-test-vm_2612e560x1284x8457e115。这使我很难创建host_vars目录,因为我必须经常运行ansible-inventory -i ...并复制目录名。

问题

是否可以创建“通配符”host_vars目录而不包括目录名中的uid?这意味着目录的名称将是unique-test-vm而不是unique-test-vm_2612e560x1284x8457e115

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-25 09:34:56

创建“通配符”host_vars是不可能的。但是,这个用例可以通过https://docs.ansible.com/ansible/latest/modules/include_vars_module.html#include-vars-load-variables-from-files-dynamically-within-a-taskhttps://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#organizing-host-and-group-variables来解决.注意变量的优先级。见变量优先级:我应该把变量放在哪里?

include_vars (单主机)

例如,让我们把这份清单

代码语言:javascript
运行
复制
shell> cat hosts
testX-vm_07

让我们创建host_vars

代码语言:javascript
运行
复制
shell> cat host_vars/testX-vm/main.yml 
test_var: test var for hosts testX-vm_*

然后下面的剧本从host_vars/testX-vm目录中读取变量。使inventory_hostname的解析适合您的需要

代码语言:javascript
运行
复制
shell> cat pb.yml
- hosts: testX-vm_07
  tasks:
    - include_vars:
        dir: "{{ 'host_vars/' ~ my_vars_dir }}"
      vars:
        my_vars_dir: "{{ inventory_hostname.split('_').0 }}"
    - debug:
        var: test_var

给出

代码语言:javascript
运行
复制
shell> ansible-playbook -i hosts pb.yml

PLAY [testX-vm_07] ****

TASK [include_vars] ****
ok: [testX-vm_07]

TASK [debug] ****
ok: [testX-vm_07] => 
  test_var: test var for hosts testX-vm_*

group_vars (多台主机)

例如,让我们把这份清单

代码语言:javascript
运行
复制
shell> cat hosts
testX-vm_01
testX-vm_02
testX-vm_03
testY-vm_01
testY-vm_02
testY-vm_03

让我们创建group_vars,由主机testX-vm_*testY-vm_*分别共享

代码语言:javascript
运行
复制
shell> cat group_vars/testX_vm/main.yml
test_var: test var for testX_vm group
代码语言:javascript
运行
复制
shell> cat group_vars/testY_vm/main.yml
test_var: test var for testY_vm group

然后,下面的剧本在第一个剧本中创建组testX_vmtestY_vm,并在第二和第三次播放中使用组。例如,

代码语言:javascript
运行
复制
shell> cat pb.yml
- hosts: all
  gather_facts: false
  tasks:
    - block:
        - add_host:
            name: "{{ item }}"
            groups: testX_vm
          loop: "{{ ansible_play_hosts_all|
                    select('match', '^testX-vm_(.*)$')|
                    list }}"
        - add_host:
            name: "{{ item }}"
            groups: testY_vm
          loop: "{{ ansible_play_hosts_all|
                    select('match', '^testY-vm_(.*)$')|
                    list }}"
      run_once: true
  
- hosts: testX_vm
  tasks:
    - debug:
        var: test_var

- hosts: testY_vm
  tasks:
    - debug:
        var: test_var

给出

代码语言:javascript
运行
复制
shell> ansible-playbook -i hosts pb.yml 

PLAY [all] ****
TASK [add_host] ****
changed: [testX-vm_01] => (item=testX-vm_01)
changed: [testX-vm_01] => (item=testX-vm_02)
changed: [testX-vm_01] => (item=testX-vm_03)

TASK [add_host] ****
changed: [testX-vm_01] => (item=testY-vm_01)
changed: [testX-vm_01] => (item=testY-vm_02)
changed: [testX-vm_01] => (item=testY-vm_03)

PLAY [testX_vm] ****
ok: [testX-vm_01] => 
  test_var: test var for testX_vm group
ok: [testX-vm_02] => 
  test_var: test var for testX_vm group
ok: [testX-vm_03] => 
  test_var: test var for testX_vm group

PLAY [testY_vm] ****
ok: [testY-vm_01] => 
  test_var: test var for testY_vm group
ok: [testY-vm_02] => 
  test_var: test var for testY_vm group
ok: [testY-vm_03] => 
  test_var: test var for testY_vm group
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62570996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档