2014-03-05 149 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

相关问题