如何在创建数据库时才能使ansible执行任务?

时间:2015-01-15 19:09:21

标签: ansible

我有一个迁移步骤,我需要在数据库引导后进行伪造,它看起来像这样:

- name: "Setup database"
  mysql_db: name=my_database state=present target=/tmp/database.sql
  args:
    login_user: root
    login_password: ""

- name: Import the database
  shell: ../../vendor/bin/propel up --fake
  args:
    chdir: /var/www/project/application/propel

首次虚假迁移数据库显然不是一个好主意。我怎么能让它只发生一次?

3 个答案:

答案 0 :(得分:15)

因此,如果我理解你想要导入数据库只有在安装数据库添加了数据库时才能运行。 安装数据库中的Registering a variable,并在导入数据库中使用when条件进行操作:

- name: "Setup database"
  mysql_db: name=my_database state=present target=/tmp/database.sql
  args:
    login_user: root
    login_password: ""
  register: db_created

- name: Import the database
  shell: ../../vendor/bin/propel up --fake
  args:
    chdir: /var/www/project/application/propel
  when: db_created.changed

答案 1 :(得分:3)

我喜欢这两个答案,并用它们来做以下事情,这对我来说是一个更清洁的解决方案。遗憾的是,任务重复,但它的工作正如您所期望的那样,只有在必须创建数据库时才会进行导入。

- name: Create DB (if necessary)
  mysql_db:
    name=my_database
    state=present
  register: db_created

- name: Import DB (if it was created)
  mysql_db:
    name=my_database
    state=import
    target=/tmp/database.sql
  when: db_created.changed

答案 2 :(得分:1)

Pasi已经为您提供了问题的答案,但即使您想跳过数据库创建步骤(如果它已经存在),您甚至可以将检查添加到它,如下所示:

- name: check if DB exists
  shell: mysql -e 'SHOW DATABASES;' | grep my_database
  register: dbstatus
  ignore_errors: True

- name: "Setup database"
  mysql_db: name=my_database state=present target=/tmp/database.sql
  args:
    login_user: root
    login_password: ""
  register: db_created
  when: dbstatus.rc != 0

- name: Import the database
  shell: ../../vendor/bin/propel up --fake
  args:
    chdir: /var/www/project/application/propel
  when: db_created.changed

希望这会对你有所帮助。感谢