2015-01-15 13 views
5

Mam etap migracji muszę udawać, gdy baza danych została bootstrapped i wygląda to mniej więcej tak:Jak mogę mieć ansibli wykonać zadanie tylko wtedy, gdy moja baza danych jest tworzona?

- 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 

To oczywiście nie jest dobrym pomysłem, aby sfałszować migracji bazy danych po raz pierwszy. Jak mogę zrobić to tylko raz?

Odpowiedz

12

Tak więc, jeśli zrozumiałem prawo chcesz zaimportować bazę danych być uruchamiane tylko wtedy, gdy baza danych Konfiguracja dodał bazy danych. Registering a variable w konfiguracji bazy i używając go when stanu w zaimportować bazę danych zrobi:

- 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

Pasi już wam odpowiedź na swoje pytanie, ale nawet jeśli chcesz pominąć tworzenie bazy danych krok, jeśli już istnieje, możesz nawet dodać do niego czek, na przykład:

- 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 

Mam nadzieję, że to ci pomoże. Dzięki

3

Podobały mi się obie te odpowiedzi i wykorzystałem je do wykonania następujących czynności, co było dla mnie znacznie czystszym rozwiązaniem. Szkoda, że ​​zadanie powtarza się, ale działa tak, jak się spodziewasz, import odbywa się tylko wtedy, gdy trzeba utworzyć bazę danych.

- 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 
0

chciałbym uruchomić tylko raz tej playbook jeśli wiesz, że ustawienie go po raz pierwszy, ale jeśli nie ma takiej możliwości, można użyć zestawu zmiennych w czasie wykonywania, aby uruchomić tylko, kiedy znać jej pierwszy raz

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

uruchomić go za pomocą ansible-playbook main.yml -e 'first_run=1'

Jeśli wiesz, to nie jest to pierwsza konfiguracja, wystarczy uruchomić go bez tej zmiennej: ansible-playbook main.yml

+1

I Myślę, że to niszczy cały pomysł automatyzacji, jeśli za każdym razem musisz podać var. Co jeśli o tym zapomnisz? Co robisz? Stracić zawartość bazy danych? Kiepski pomysł – user1970395

Powiązane problemy