首页 文章

在group_vars /中定义的Ansible变量未找到

提问于
浏览
11

假设Ansible结构:

.
├── group_vars
│   └── all
└── site.yml

all 包含 my_test_variable: yessite.yml 是:

- hosts: all

  tasks:
    - name: Variable test
      debug: msg={{ my_test_variable }}

我正在使用Vagrant在本地运行它,所以命令看起来像:

$ ansible-playbook site.yml -i /path-to-vagrant/.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory --private-key=/path-to-vagrant/.vagrant/machines/default/virtualbox/private_key -u vagrant

Vagrant生成的反转文件:

# Generated by Vagrant

default ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222

并输出:

PLAY: ***************************************************************************

TASK [setup] ********************************************************************
ok: [default]

TASK [Variable test] ************************************************************
fatal: [default]: FAILED! => {"msg": "ERROR! the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'my_test_variable' is undefined", "failed": true}

PLAY RECAP **********************************************************************
default                    : ok=1    changed=0    unreachable=0    failed=1

我知道这个流浪汉库存不在任何组内 - 因为没有 - 但所有组都继承自 all ,对吧?

为什么不起作用?我错过了什么?


我对Ansible很新 . 阅读了很多文档,几个例子甚至一些SO问题,比如Ansible doesn't pick up group_vars without loading it manually - 不是我的问题 - 和Cannot get ansible to recognize group variables - 关闭但不是那里 .


编辑

我正在遵循Ansible's doc推荐的项目结构,而在variables doc entry中他们提到 global_vars/all

站点范围默认值应定义为“group_vars / all”设置 .

即使没有关于如何加载这些默认值的直接参考,我认为我不必明确添加它们(如@ thiago-borges的回答中所建议的那样) . 或者我呢?

这样做的原因是我打算从 all 继承组变量,如:

.
├── group_vars
│   └── all
│   └── production
│   └── staging
└── site.yml

当我为每个执行ansible-playbook时,加载不同的文件而不必在播放文件中明确设置它们,例如:

ansible-playbook -i production site.yml


编辑2

问题是关于ansible的错误 . 更新后,它按照记录的方式工作 .

我应该删除这个问题吗?

3 回答

  • 3

    来自Ansible的官方指南:

    除了将变量直接存储在INI文件中之外,主机和组变量还可以存储在相对于库存文件的单个文件中 .

    由于Vagrant在 ./.vagrant/provisioners/ansible/inventory/ 中生成其库存文件,您需要将 group_vars 上的符号链接放入此目录中 .

    假设您在 Vagrantfile.vagrant 所在的目录中有 group_vars

    cd ./.vagrant/provisioners/ansible/inventory; ln -sf ../../../../group_vars; cd -
    
  • 0

    它的结构或代码没有任何问题 . 不工作的原因是ansible的错误 .

    虽然我找不到与此问题完全匹配的错误报告,但我相信这个问题Ansible incorrectly constructing paths when running a playbook in a subdirectorythis other issue我报告过自己可能是相关的 .

    目前从修订版a1948dd1c151f01ce93d0b76745469a7065ef45e运行ansible,它工作正常:

    PLAY ***************************************************************************
    
    TASK [setup] *******************************************************************
    ok: [default]
    
    TASK [Variable test] ***********************************************************
    ok: [default] => {
        "changed": false, 
        "msg": true
    }
    
    PLAY RECAP *********************************************************************
    default                    : ok=2    changed=0    unreachable=0    failed=0
    
  • 4

    在您的site.yml上,尝试设置var_files配置 .

    - hosts: all
      vars_files:
        - group_vars/all
      tasks:
        - name: Variable test
          debug: msg={{ my_test_variable }}
    

相关问题