Ansible:如何检查角色变量中何时存在:db?

Ansible:如何检查角色变量中何时存在:db?,ansible,Ansible,因此,我试图理解如何在剧本中传递角色变量,我偶然发现了一些语法。我不知道如何告诉ansible只创建一个不存在的mysql数据库。我发现,特别是将其作为角色变量传递是一项挑战。它能被传递一个state=present吗 这是我的密码: --- - name: Install MySQL host: development roles: - {role: mysql, mysql_db: [{name: benz}], when: ????, mysql_users:

因此,我试图理解如何在剧本中传递角色变量,我偶然发现了一些语法。我不知道如何告诉ansible只创建一个不存在的mysql数据库。我发现,特别是将其作为角色变量传递是一项挑战。它能被传递一个state=present吗

这是我的密码:

---
- 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之前评估的。