我正在尝试编写一个非常灵活的Playbook,它基于它们所处的环境来定位主机 . 我正在使用尽可能多的变量,因此可以将其重复用于其他项目/环境 .
我有一个application.yml
---
- name: Prepare app-server for "The app"
hosts: "{{'env'}}_super_app"
vars:
vars_files:
- "environments/{{env}}.yml"
sudo: yes
tasks:
- command: echo {{env}}
roles:
- common
- nginx
- php5-fpm
- nodejs
- newrelic
- users
- composer
- name: Install and configure mysql for "The super app"
hosts:
- "{{env}}_super_db"
vars:
vars_files:
- "environments/{{env}}.yml"
sudo: yes
roles:
- common
- mysql
- newrelic
这是playbook目录结构:
├── environments
│ ├── prod.yml << environment specific vars
│ ├── stag.yml << environment specific vars
│ └── uat.yml << environment specific vars
├── roles
│ ├── common
│ ├── composer
│ ├── mysql
│ ├── newrelic
│ ├── nginx
│ ├── nodejs
│ ├── php5-fpm
│ └── users
├── users
│ └── testo.yml
├── prod << inventory file for production
├── README.md
├── application.yml << application playbook
├── stag << inventory file for staging
├── uat << inventory file for uat
以下是uat库存文件的内容:
[uat_super_app]
10.10.10.4
[uat_super_db]
10.10.10.5
当我运行我的剧本时,我将环境作为额外的变量传递:
ansible-playbook -K -i uat application.yml -e="env=uat" --check
想法是:如果将{}设置为uat,则将使用环境/ uat.yml变量,并且将基于{} _ super_app对主机[uat_super_app]进行定位 .
如果我或任何人犯了错误并尝试针对 生产环境 库存运行uat变量,则主机将不匹配,并且ansible将不会运行该剧本 .
ansible-playbook -K -i prod application.yml -e="env=uat" --check
当我不在主机定位中使用变量时,此剧本有效 . 问题是没有主机匹配任何一种方式:
ansible-playbook -K -i uat application.yml -e="env=uat" --check -vvvv
SUDO password:
PLAY [Prepare app-server for "The app"] *******************************
skipping: no hosts matched
PLAY [Install and configure mysql for "The app"] **********************
skipping: no hosts matched
PLAY RECAP ********************************************************************
2 回答
看起来你正在使用字符串
env
,而不是变量,它的计算结果为env_super_app
. 我想你的意思是:谢谢udondan,但那没用 .
解决方案是以类似于剧本期望看到它们的方式传递变量 .
如果我在剧本中指定env,我会:
所以传递变量的正确方法是:
为了测试这个,我使用了--list-hosts选项: