我试图在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
中的文档分离环境答案 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"
这样做可以带来多重好处:
roles/exemple/vars/
目录中的单独文件中创建特定于env的变量。