2014-03-05 95 views
1

所以我想了解如何在劇本中傳遞角色變量,並且偶然發現了一些語法。我無法弄清楚如何告訴唯有創建一個mysql數據庫,如果它不存在。它特別將它作爲一個角色變量傳遞,我覺得它很具有挑戰性。它可以通過狀態=存在嗎?Ansible:如何檢查:db是否存在於角色變量中?

這裏是我的代碼:

--- 
- name: Install MySQL 
    host: development 
    roles: 
    - {role: mysql, mysql_db: [{name: benz}], when: ????, 
     mysql_users: [{name: ben3, pass: foobar, priv: "*.*:ALL"}], when: ???} 

回答

1

我不相信roles是來解決這個問題,因爲一個角色聲明被評估之前,你不能註冊變量的最佳方式。從文檔中,您只能使用ansible facts,在您的Playbook執行之前實際得到評估。另一種意見中,when關鍵字,就是要在role語句只使用一次:

--- 
- name: Install MySQL 
    host: development 
    roles: 
    - {role: mysql, 
     mysql_db: [{name: benz}], 
     mysql_users: [{name: ben3, pass: foobar, priv: "*.*:ALL"}], 
     when: "some_ansible_fact == 'Whatever'"} 

你可能已經熄滅在劇本任務,你的支票,如果你需要檢查MySQL數據庫是否存在更好。您可以使用關鍵字register,查看是否存在數據庫:

--- 
- name: Install Mysql 
    hosts: all 
    user: myrootuser 
    sudo: True 
    tags: mytag 

    vars: 
     mysql_users: [{name: ben3, pass: foobar, priv: "*.*:ALL"}] 
     mysql_db: mydatabasename 

    tasks: 

    - name: Install the mysql package 
     apt: pkg=mysql-server state=present 

    - name: Find out the master log file name and position 
     command: > 
     /usr/bin/mysql -umysql_user -pmysql_password 
     -e "SHOW DATABASES;" 
     register: databases 

    - name: Create users if they don't exist 
     command: > 
     # or run whatever you need to run here to create users 
     /usr/bin/mysql -umysql_user -pmysql_password 
     -e "CREATE USER {{ mysql_users[0]['name'] }};" 
     when: databases.stdout.find('{{ mysql_db }}') != -1 

希望這有助於。

+0

再次Rico。我想過要走這條路。但是我在一些關於Ansible Galaxy的最流行的劇本中發現的角色變量使我困惑不解。所以大多數(所有?)角色變量都可以像普通變量一樣過去? – StenW

+0

我的意思是說「再次感謝@Rico」 – StenW

+0

@StenW是的,他們是常規變量。但請記住,在變量AFAIK之前評估角色。 – Rico

相關問題