如何让 ansible 仅在创建数据库时执行任务?

How can I have ansible execute a task only when my database is created?

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

- 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

在第一次之后假迁移数据库显然不是一个好主意。我怎样才能让它只发生一次?

所以,如果我理解正确的话,您希望 导入数据库 仅当 设置数据库 添加了一个 运行数据库。 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

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

希望对您有所帮助。谢谢

我喜欢这两个答案并使用它们来执行以下操作,这对我来说是一个更简洁的解决方案。遗憾的是,该任务会重复进行,但它会按您预期的那样工作,只有在必须创建数据库时才会进行导入。

- 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

如果你知道你是第一次设置这个剧本,我只会 运行 一次,但如果你没有那个选项,你可以使用一个变量集 运行只有 运行 第一次知道的时候

- name: Import the database
  shell: ../../vendor/bin/propel up --fake
  args:
    chdir: /var/www/project/application/propel
  when: "first_run | default(false)"

运行 它使用 ansible-playbook main.yml -e 'first_run=1'

如果您知道这不是第一个设置,只需 运行 它没有那个变量:ansible-playbook main.yml