2015-01-15 7 views
5

Ho un passo della migrazione ho bisogno di fingere dopo che il database è stato bootstrap e sembra qualcosa di simile:Come posso avere un'attivazione eseguibile un'attività solo quando viene creato il mio database?

- 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 

sarebbe ovviamente non essere una buona idea di falsificare la migrazione del database dopo la prima volta. Come posso farlo solo una volta?

risposta

12

Quindi, se ho capito giusto che si desidera importare il database per essere eseguito solo quando il database Setup ha aggiunto un database. Registering a variable in Setup banca dati e utilizzarlo con when condizione in importare il database lo farà:

- 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 ti ha già dato la risposta della tua domanda, ma anche se si desidera saltare la creazione del database passo se esiste già, puoi anche aggiungere il controllo, in questo modo:

- 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 

Spero che questo ti possa aiutare. Grazie

3

Mi sono piaciute entrambe le risposte e le ho utilizzate per fare quanto segue, che per me era una soluzione molto più pulita. È un peccato che il compito si ripeta ma funziona come ci si aspetterebbe, l'importazione avviene solo se il database dovesse essere creato.

- 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

vorrei correre solo che questa volta playbook se si sa che si sta configurando in su per la prima volta, ma se non si dispone di questa opzione, è possibile utilizzare una variabile impostata in fase di esecuzione per l'esecuzione solo quando si conoscere la sua la prima volta

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

Run utilizzando ansible-playbook main.yml -e 'first_run=1'

Se sai che questo non è la prima installazione, basta eseguirlo senza quella variabile: ansible-playbook main.yml

+1

I pensa che questo rovini l'intera idea dell'automazione se devi specificare la variabile ogni volta. Cosa succede se ti dimentichi di questo? Tu fai cosa? Perdere il contenuto del tuo database? Cattiva idea – user1970395

Problemi correlati