it-swarm.com.de

Wie kann ich Variablen innerhalb der Taskdatei in ansible schreiben?

Ich habe das play.yml

---
- hosts: 127.0.0.1
  connection: local
  Sudo: false

  tasks:
     - include: Apache.yml

Mein Apache sieht so aus:

vars:
    url: czxcxz

- name: Download Apache
  Shell: wget {{url}} 

Das gibt mir Fehler.

Wenn ich vars entferne, funktioniert es. Aber ich möchte die Variablen in Aufgaben einbeziehen, damit ich verschiedene Variablen für verschiedene Aufgaben getrennt halten kann.

41
user1994660

HINWEIS: Verwenden von set_fact setzt wie unten beschrieben eine Tatsache/Variable auf die Remote-Server, auf denen die Task ausgeführt wird. Diese Tatsache/Variable bleibt dann für alle nachfolgenden Aufgaben während der gesamten Dauer Ihres Playbooks bestehen.

Auch diese Fakten sind unveränderlich (für die Dauer des Playbooks) und können nicht geändert werden, sobald sie festgelegt wurden.


URSPRÜNGLICHE ANTWORT

Verwenden set_fact vor Ihrer Aufgabe, facts festzulegen, die mit Variablen austauschbar zu sein scheinen:

- name: Set Apache URL
  set_fact:
    Apache_url: 'http://example.com/Apache'

- name: Download Apache
  Shell: wget {{ Apache_url }}

Siehe http://docs.ansible.com/set_fact_module.html für das offizielle Wort.

66
dodgio

Ich weiß, es ist lange her, aber da die einfachste Antwort noch nicht veröffentlicht wurde, werde ich dies für andere Benutzer tun, die möglicherweise vorbeischauen.

Verschieben Sie die Variable einfach in den "name" -Block:

- name: Download Apache
  vars:
    url: czxcxz
  Shell: wget {{url}} 
12
appleitung

Variablendefinitionen sollen in Aufgaben verwendet werden. Wenn Sie sie jedoch in Tasks einbeziehen möchten, verwenden Sie wahrscheinlich die Direktive register. So was:

- name: Define variable in task.
  Shell: echo "http://www.my.url.com"
  register: url

- name: Download Apache
  Shell: wget {{ item }}
  with_items: url.stdout

Sie können auch Rollen betrachten, um Aufgaben in Abhängigkeit von den verschiedenen Rollen Rollen zu trennen. Auf diese Weise können Sie für jede Ihrer Rollen separate Variablen festlegen. Beispielsweise haben Sie möglicherweise eine url -Variable für Apache1 und eine separate url Variable für die Rolle Apache2.

9
Rico

In Ihrem Beispiel ist Apache.yml eine Jobliste, aber kein Playbook

Abhängig von der gewünschten Architektur haben Sie folgende Möglichkeiten:

  1. Konvertieren Sie Apache.yml in role. Definieren Sie dann Aufgaben in den Rollen/Apache/tasks/mail.yml und Variablen in den Rollen/Apache/defaults/mail.yml.

  2. Setze vars in play.yml playbook

play.yml

---
- hosts: 127.0.0.1
  connection: local
  Sudo: false

  vars:
    url: czxcxz

  tasks:
     - include: Apache.yml

Apache.yml

- name: Download Apache
  Shell: wget {{url}} 
2
mmv-ru

Immer wenn Sie ein Modul haben, dem eine Variable in derselben Zeile in Ansible folgt, behandelt der Parser die Referenzvariable als den Anfang eines Inline-Wörterbuchs. Beispielsweise:

- name: some example
  command: {{ myapp }} -a foo

Standardmäßig wird hier der erste Teil von {{ myapp }} -a foo Als Wörterbuch anstelle einer Zeichenfolge analysiert, und es wird eine Fehlermeldung angezeigt.

Sie müssen das Argument also wie folgt zitieren:

- name: some example
  command: "{{ myapp }} -a foo"
0
Dwayne Mcnab