ansible Definition der variable für den timestamp
Ich habe Probleme bei der Einstellung einer variable mit einem Zeitstempel in ansible verwenden Sie es durch mein playbook.
Was ich erreichen will ist, den release-Ordner-name in die zwei Server und eine neue db Tags mit den gleichen timestamp.
Ich bin die Definition dieser Variablen in eine Datei namens common.yml in /ansibleproject/vars/.
timestamp: "{{lookup('pipe', 'date +%Y%m%d%H%M%SZ')}}"
release_name: '{{ repo_tag }}_{{timestamp}}'
new_db_name: '{{release_name}}'
Klicken Sie dann auf task-file, die ich erstellen der dirs so:
- name: "Create new release folder"
file: path={{new_release_path}} state=directory mode=2775 owner=deployment group=deployment
become: yes
Und auf einem separaten task-file, die ich erstellen der db so:
- name: "Prepare db user rights"
shell: echo "CREATE DATABASE \`{{new_db_name}}\` CHARACTER SET utf8 COLLATE utf8_general_ci; " > db_create.sql
when: inventory_hostname == groups['app'][0]
- name: "Create new database for new release"
shell: mysql -h {{mysql_server}} -u{{mysql_username}} -p{{mysql_password}} < db_create.sql
when: inventory_hostname == groups['app'][0]
Den Ordner erstellt mit dem gleichen Zeitstempel auf den beiden Servern bin ich bereitstellen:
drwxrwsr-x 2 deployment deployment 4096 Mar 14 16:36 test_20170314173640Z/
aber der db-name hat einen anderen Zeitstempel.
mysql> show databases;
+---------------------------------------------------------------+
| Database |
+---------------------------------------------------------------+
| information_schema |
| dummy |
| mysql |
| performance_schema |
| test_20170314173819Z |
+---------------------------------------------------------------+
Ich war Lesung über "set_fact" einen timestamp, aber das scheint zu funktionieren, die auf einem host-basis.
Gibt es eine Möglichkeit zu haben, es konsistent auf beiden Servern und auf der db?
Grüße,
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist das erwartete Verhalten, da die Variablen Vorlagen, wenn verwendet, aber nicht als "definiert" (Sie sind nicht definiert, eigentlich).
So
date +%Y%m%d%H%M%SZ
ausgeführt wird, für jede Aufgabe (die zu unterschiedlichen Zeiten von der Ursache).Wenn Sie brauchen, Konsistenz, verwenden Sie
set_fact
zu machen, die hartnäckige Tatsache:Nach dieser
timestamp
ist ein einfacher string mit dem Ergebnis der pipe, und nicht Jinja Ausdruck, wie es in Ihrem Fall.Können Sie diese Tatsache für jeden host oder nur für
localhost
und auf Sie zugreifenhostvars['localhost'].timestamp
von anderen hosts.- hosts: localhost tasks: - name: "Getting current timestamp" set_fact: timestamp_fact: "{{ lookup('pipe', 'date +%Y%m%d%H%M%SZ') }}"
vars/common.ymltimestamp: "{{ hostvars['localhost'].timestamp_fact }}"
ich bin nicht sicher, ob es redundant ist zu "definieren" timestamp wieder in der vars-Datei, aber es macht es leichter für späteren Zugriff in die Aufgaben-Dateien mit {{timestamp}}