Ansible:如何检查角色变量中何时存在:db?
因此,我试图理解如何在剧本中传递角色变量,我偶然发现了一些语法。我不知道如何告诉ansible只创建一个不存在的mysql数据库。我发现,特别是将其作为角色变量传递是一项挑战。它能被传递一个state=present吗 这是我的密码:Ansible:如何检查角色变量中何时存在:db?,ansible,Ansible,因此,我试图理解如何在剧本中传递角色变量,我偶然发现了一些语法。我不知道如何告诉ansible只创建一个不存在的mysql数据库。我发现,特别是将其作为角色变量传递是一项挑战。它能被传递一个state=present吗 这是我的密码: --- - name: Install MySQL host: development roles: - {role: mysql, mysql_db: [{name: benz}], when: ????, mysql_users:
---
- name: Install MySQL
host: development
roles:
- {role: mysql, mysql_db: [{name: benz}], when: ????,
mysql_users: [{name: ben3, pass: foobar, priv: "*.*:ALL"}], when: ???}
我不认为
roles
是解决这个问题的最佳方法,因为在计算role语句之前不能注册变量。从文档中,您只能使用在playbook执行之前实际得到评估的ansible facts
。另一个注释是when
关键字,在角色
语句中仅使用一次:
---
- 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数据库是否存在,那么最好不要在playbook任务中进行检查。您可以使用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
希望这能有所帮助。再说一遍,里科。我想走这条路。但我在Ansible Galaxy上一些最受欢迎的剧本中发现的角色变量让我感到困惑。所以大多数(所有?)角色变量都可以作为普通变量过去?@StenW是的,它们是正则变量。但请记住,角色是在变量AFAIK之前评估的。