无法获取ansible以识别组变量

无法获取ansible以识别组变量,ansible,ansible-playbook,Ansible,Ansible Playbook,我正在尝试在ansible中设置特定于环境的变量(例如生产、分段、开发)。出于某种原因,ansible没有在group_vars/[environment]中拾取变量 我用的是ansible 1.9.1 这里有一个简单的例子来说明我要做的事情 目录结构: . ├── group_vars │   └── staging ├── hosts │   └── staging └── site.yml . ├── group_vars │ └── all ├── hosts │ └── lo

我正在尝试在ansible中设置特定于环境的变量(例如生产、分段、开发)。出于某种原因,ansible没有在group_vars/[environment]中拾取变量

我用的是ansible 1.9.1

这里有一个简单的例子来说明我要做的事情

目录结构:

.
├── group_vars
│   └── staging
├── hosts
│   └── staging
└── site.yml
.
├── group_vars
│   └── all
├── hosts
│   └── local
│   └── staging
│   └── prod
├── roles
│   └── exemple
│       └── tasks
│       └── vars
│           └── local.yml
│           └── staging.yml
│           └── prod.yml
└── site.yml
组变量/分段:

test_var: "this is a test"
site.yml:

---
- hosts: localhost
  tasks:
  - debug: msg="test variable = {{ test_var }}"
hosts/staging是一个空文件

运行ansible playbook-i hosts/staging site.yml的输出

PLAY [localhost] **************************************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [debug msg="test variable = {{ test_var }}"] ****************************
fatal: [localhost] => One or more undefined variables: 'test_var' is undefined

FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************
           to retry, use: --limit @/Users/jcowley/site.retry

localhost                  : ok=1    changed=0    unreachable=1    failed=0
如果我将group_vars/staging移动到group_vars/all,它将按预期工作并输出test_var的值。但我试图了解如何根据Ansible的编辑中的文档分离环境:

为了更具体地回答您的问题,请看一下这个项目。我想这就是你想做的。 我可能错了,但我认为问题来自你的库存文件。实际上,您是在清单文件名(
staging
)之后为
group\u vars
文件(
staging
)命名的。 但是,您必须在清单文件中的部分后命名它,我想这是查看您的剧本的
localhost

因此,这是您应该拥有的:

主机/暂存:

test_var: "this is a test"
根据我的说法,这里有一个更可行的解决方案来组织你的项目。它是基于

目录结构:

.
├── group_vars
│   └── staging
├── hosts
│   └── staging
└── site.yml
.
├── group_vars
│   └── all
├── hosts
│   └── local
│   └── staging
│   └── prod
├── roles
│   └── exemple
│       └── tasks
│       └── vars
│           └── local.yml
│           └── staging.yml
│           └── prod.yml
└── site.yml
组变量/all
可以有一个env变量:

# The application environment
# Possible values are : prod, staging or local
env: local

# Other global variables
...
您的库存文件:

[local]
X.X.X.X

[staging]
X.X.X.X

[prod]
X.X.X.X
然后,您的playbook
sites.yml
可以如下所示:

---
- name: Server(s) configuration
  hosts: "{{env}}"
  roles:
    - exemple
  vars_files:
    - "roles/example/vars/{{env}}.yml"
这样做可以为您带来多种好处:

  • 您可以在项目中的任何地方、jinja模板中或作为非常实用的任务中的条件重用env变量
  • 您的项目被分成不同的角色。对于大型项目来说,这种方式更简洁(您可以拥有apache角色、ssh角色等)
  • 您可以在
    roles/example/vars/
    目录中的单独文件中创建特定于环境的变量

谢谢@gui don。这看起来是一个可行的解决办法。不过,我仍然想理解为什么我的示例不起作用。据我所知,这正是根据Ansible文档和我在网上找到的众多示例应该做的。希望了解我的示例中是否存在我没有看到的错误。再次感谢建议的解决方法。但是我想知道为什么带有group_vars/staging的标准目录结构不起作用。不应要求使用环境变量,也不应通过“var_files”指令显式加载变量。这里有一个和我一样的例子。还有很多其他的。“我错过了什么?”杰森·考利肯定。正如我在回答中所说,您是否检查了您的库存文件,以包含一个以您的
group\u vars
文件命名的部分?啊,好的。就这样。主机/暂存文件需要定义[暂存]。非常感谢。