无法识别组变量

时间:2015-06-26 14:33:15

标签: ansible ansible-playbook

我试图在ansible中设置特定于环境的变量(例如,生产,登台,开发)。出于某种原因,ansible没有在group_vars / [environment]中获取变量。

我使用的是ansible 1.9.1

以下是我尝试做的事情的简要示例。

目录结构:

test_var: "this is a test"

group_vars /分期:

---
- hosts: localhost
  tasks:
  - debug: msg="test variable = {{ test_var }}"

site.yml:

ansible-playbook -i hosts/staging site.yml

hosts / staging是一个空文件

运行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 的输出:

git config filter.xxx.clean 'script'

如果我将group_vars / staging移动到group_vars / all,它将按预期工作并输出test_var的值。但我试图了解如何根据Ansible Best Practices

中的文档分离环境

1 个答案:

答案 0 :(得分:3)

编辑:

要更具体地回答您的问题,请查看this github exemple项目。我认为,这是你试图做的。 我可能错了,但我认为问题来自您的库存文件。您实际上在库存文件名(group_vars)之后命名了staging个文件(staging)。 但是,您必须在广告资源文件中的部分之后命名,我想,localhost正在查看您的剧本。

因此,这就是你应该拥有的:

主机/分期

[staging]
X.X.X.X

据我所知,这是一个更可行的解决方案来组织您的项目。它基于roles

目录结构:

.
├── group_vars
│   └── all
├── hosts
│   └── local
│   └── staging
│   └── prod
├── roles
│   └── exemple
│       └── tasks
│       └── vars
│           └── local.yml
│           └── staging.yml
│           └── prod.yml
└── site.yml

group_vars/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

然后,您的剧本sites.yml可能如下所示:

---
- name: Server(s) configuration
  hosts: "{{env}}"
  roles:
    - exemple
  vars_files:
    - "roles/example/vars/{{env}}.yml"

这样做可以带来多重好处:

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