我不相信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
希望这有助于。
再次Rico。我想过要走这条路。但是我在一些关于Ansible Galaxy的最流行的剧本中发现的角色变量使我困惑不解。所以大多数(所有?)角色变量都可以像普通变量一样过去? – StenW
我的意思是说“再次感谢@Rico” – StenW
@StenW是的,他们是常规变量。但请记住,在变量AFAIK之前评估角色。 – Rico