我正在嘗試編寫一個基於他們所處環境的目標主機的非常靈活的劇本。我使用盡可能多的變量,因此劇本可以重用於其他項目/環境只需很少的更改。在劇本中使用可變主機中的變量
我有一個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
這裏是劇本的目錄結構:
├── 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
的想法是: 如果{{ENV}}設爲UAT,則環境/ uat.yml瓦爾將被使用,和主機[uat_super_app]將基於{{ENV}} _ super_app針對性。
如果我或任何人犯了一個錯誤,並試圖對生產庫存運行uat vars,主機將不匹配,並且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 ********************************************************************
就我所知,使用'-e ='vars:env = uat''的語法是沒有記錄的。你能告訴我你在哪裏發現它嗎?任何網站鏈接/ google-group-threads/github-gists/etc – Zasz
這很奇怪。在我的一本劇本中,我做了一些非常相似的事情,而我的' - extra-vars'中從來沒有過'vars:'部分。 – udondan
@Zasz我偶然發現它。 – Egidijus