无法识别组变量

Jas*_*ley 5 ansible ansible-playbook

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

我正在使用 ansible 1.9.1

这是我正在尝试做的一个精简的例子。

目录结构:

.
??? group_vars
?   ??? staging
??? hosts
?   ??? staging
??? site.yml
Run Code Online (Sandbox Code Playgroud)

group_vars/分期:

test_var: "this is a test"
Run Code Online (Sandbox Code Playgroud)

站点.yml:

---
- hosts: localhost
  tasks:
  - debug: msg="test variable = {{ test_var }}"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果我将 group_vars/staging 移动到 group_vars/all,它会按预期工作并输出 test_var 的值。但是我试图了解如何根据 Ansible最佳实践中的文档来分离环境

Gui*_*Don 5

编辑:

要更具体地回答您的问题,请查看此 github 示例项目。我想,这就是你试图做的。我可能错了,但我认为问题来自您的库存文件。您实际上以库存文件名 ( )命名了您的group_vars文件 ( )。但是,您必须以库存文件中的部分命名,我想也就是查看您的剧本。stagingstaginglocalhost

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

主机/登台

[staging]
X.X.X.X
Run Code Online (Sandbox Code Playgroud)

根据我的说法,这是组织项目的更可行的解决方案。它基于角色

目录结构:

.
??? group_vars
?   ??? all
??? hosts
?   ??? local
?   ??? staging
?   ??? prod
??? roles
?   ??? exemple
?       ??? tasks
?       ??? vars
?           ??? local.yml
?           ??? staging.yml
?           ??? prod.yml
??? site.yml
Run Code Online (Sandbox Code Playgroud)

group_vars/all可以有一个环境变量:

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

# Other global variables
...
Run Code Online (Sandbox Code Playgroud)

您的库存文件:

[local]
X.X.X.X

[staging]
X.X.X.X

[prod]
X.X.X.X
Run Code Online (Sandbox Code Playgroud)

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

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

这样做可以为您带来多种好处:

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