2015-04-17 56 views
4

我正在嘗試編寫一個基於他們所處環境的目標主機的非常靈活的劇本。我使用盡可能多的變量,因此劇本可以重用於其他項目/環境只需很少的更改。在劇本中使用可變主機中的變量

我有一個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 ******************************************************************** 

回答

2
hosts: "{{'env'}}_super_app" 

這看起來像你使用字符串env,不是變量,計算結果爲env_super_app。我認爲你的意思是:

hosts: "{{ env }}_super_app" 
1

感謝udondan,但沒有奏效。

解決方案是通過類似於劇本預期看到它們的方式傳遞變量。

如果我被指定在劇本的ENV我會:

--- 
- name: Prepare app-server for "The app" 
    hosts: uat_super_app 
    vars: 
    - env: uat 

那麼傳遞變量的正確方法是:

ansible-playbook -K -i uat application.yml -e='vars: env=uat' 

爲了測試這個我用--list -hosts選項:

ansible-playbook -K -i uat application.yml -e='vars: env=uat' --list-hosts 

playbook: application.yml 

    play #1 (Prepare app-server for "The super app"): host count=1 
    10.10.10.4 

    play #2 (Install and configure mysql for "The super app"): host count=1 
    10.10.10.5 
+0

就我所知,使用'-e ='vars:env = uat''的語法是沒有記錄的。你能告訴我你在哪裏發現它嗎?任何網站鏈接/ google-group-threads/github-gists/etc – Zasz

+0

這很奇怪。在我的一本劇本中,我做了一些非常相似的事情,而我的' - extra-vars'中從來沒有過'vars:'部分。 – udondan

+0

@Zasz我偶然發現它。 – Egidijus