Egi*_*jus 5 scope development-environment ansible
我正在尝试编写一个非常灵活的剧本,它根据主机所在的环境针对主机。我使用了尽可能多的变量,因此剧本可以以最小的更改重用于其他项目/环境。
我有一个 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
Run Code Online (Sandbox Code Playgroud)
这是剧本目录结构:
??? 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
Run Code Online (Sandbox Code Playgroud)
以下是uat清单文件的内容:
[uat_super_app]
10.10.10.4
[uat_super_db]
10.10.10.5
Run Code Online (Sandbox Code Playgroud)
当我运行我的剧本时,我将环境作为一个额外的变量传递:
ansible-playbook -K -i uat application.yml -e="env=uat" --check
Run Code Online (Sandbox Code Playgroud)
想法是:如果 {{env}} 设置为 uat,则将使用环境/uat.yml 变量,并且将基于 {{env}}_super_app 定位主机 [uat_super_app]。
如果我或任何人犯了错误并尝试针对生产库存运行 uat 变量,则主机将不匹配,并且 ansible 将不会运行剧本。
ansible-playbook -K -i prod application.yml -e="env=uat" --check
Run Code Online (Sandbox Code Playgroud)
当我在主机定位中不使用变量时,此剧本有效。问题是没有主机匹配任何一种方式:
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 ********************************************************************
Run Code Online (Sandbox Code Playgroud)
hosts: "{{'env'}}_super_app"
Run Code Online (Sandbox Code Playgroud)
看起来您正在使用 string env
,而不是变量,其计算结果为env_super_app
。我想你的意思是:
hosts: "{{ env }}_super_app"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3461 次 |
最近记录: |