it-swarm.com.de

ansible: wie man mehrere Befehle übergibt

Ich habe es versucht:

- command: ./configure chdir=/src/package/
- command: /usr/bin/make chdir=/src/package/
- command: /usr/bin/make install chdir=/src/package/

das klappt aber ich schätze da ist was mehr .. ordentliches.

Also habe ich Folgendes versucht:

from: https://stackoverflow.com/questions/24043561/multiple-commands-in-the-same-line-for-bruker-topspin was mir "no such file or directory" zurückgibt

- command: ./configure;/usr/bin/make;/usr/bin/make install chdir=/src/package/

Ich habe es auch versucht: https://u.osu.edu/hasnan.1/2013/12/16/ansible-run-multiple-commands-using-command-module-and-with-items/

aber ich konnte nicht die richtige Syntax finden:

- command: "{{ item }}" chdir=/src/package/
  with_items:
      ./configure
      /usr/bin/make
      /usr/bin/make install

Das funktioniert nicht, wenn man sagt, dass es ein Zitatproblem gibt.

Jemand?

59
John Doe

Beginnt ein Wert in YAML mit einer geschweiften Klammer ({) geht der YAML-Parser davon aus, dass es sich um ein Wörterbuch handelt. In Fällen wie diesem, in denen der Wert eine (Jinja2) -Variable enthält, muss eine der beiden folgenden Strategien angewendet werden, um eine Verwechslung des YAML-Parsers zu vermeiden:

Zitiere den ganzen Befehl:

- command: "{{ item }} chdir=/src/package/"
  with_items:
  - ./configure
  - /usr/bin/make
  - /usr/bin/make install    

oder ändern Sie die Reihenfolge der Argumente:

- command: chdir=/src/package/ {{ item }}
  with_items:
  - ./configure
  - /usr/bin/make
  - /usr/bin/make install

Danke für den @ RamondelaFuente Alternativvorschlag.

79
Pedro Romano

Um mehrere Shell-Befehle mit ansible auszuführen, können Sie das Shell -Modul mit mehrzeiliger Zeichenfolge verwenden (beachten Sie den vertikalen Schrägstrich nach Shell :), wie in diesem Beispiel gezeigt:

  - name: Build nginx 
    Shell: |
      cd nginx-1.11.13
      Sudo ./configure
      Sudo make
      Sudo make install
48
Arvik

Ich stand vor dem gleichen Problem. In meinem Fall befand sich ein Teil meiner Variablen in einem Wörterbuch, d. H. With_dict variable (looping), und ich musste 3 Befehle für jeden item.key ausführen. Diese Lösung ist relevanter, wenn Sie das Wörterbuch with_dict verwenden müssen, um mehrere Befehle auszuführen (ohne with_items zu benötigen)

Die Verwendung von with_dict und with_items in einer Task hat nicht geholfen, da die Variablen nicht aufgelöst wurden.

Meine Aufgabe war wie folgt:

- name: Make install git source
  command: "{{ item }}"
  with_items:
    - cd {{ tools_dir }}/{{ item.value.artifact_dir }}
    - make prefix={{ tools_dir }}/{{ item.value.artifact_dir }} all
    - make prefix={{ tools_dir }}/{{ item.value.artifact_dir }} install
  with_dict: "{{ git_versions }}"

rolls/git/defaults/main.yml war:

---
tool: git
default_git: git_2_6_3

git_versions:
  git_2_6_3:
    git_tar_name: git-2.6.3.tar.gz
    git_tar_dir: git-2.6.3
    git_tar_url: https://www.kernel.org/pub/software/scm/git/git-2.6.3.tar.gz

Das Obige führte zu einem Fehler ähnlich dem Folgenden für jedes {{item}} (für 3 Befehle, wie oben erwähnt). Wie Sie sehen, sind die Werte von tools_dir nicht ausgefüllt (tools_dir ist eine Variable, die in den Standardeinstellungen/main.yml einer allgemeinen Rolle definiert ist, und der Wert item.value.git_tar_dir wurde nicht ausgefüllt/aufgelöst).

failed: [server01.poc.jenkins] => (item=cd {# tools_dir #}/{# item.value.git_tar_dir #}) => {"cmd": "cd '{#' tools_dir '#}/{#' item.value.git_tar_dir '#}'", "failed": true, "item": "cd {# tools_dir #}/{# item.value.git_tar_dir #}", "rc": 2}
msg: [Errno 2] No such file or directory

Die Lösung war einfach. Anstatt das "COMMAND" -Modul in Ansible zu verwenden, habe ich das "Shell" -Modul verwendet und eine Variable in rolls/git/defaults/main.yml erstellt

So, jetzt sieht rolls/git/defaults/main.yml so aus:

---
tool: git
default_git: git_2_6_3

git_versions:
  git_2_6_3:
    git_tar_name: git-2.6.3.tar.gz
    git_tar_dir: git-2.6.3
    git_tar_url: https://www.kernel.org/pub/software/scm/git/git-2.6.3.tar.gz

#git_pre_requisites_install_cmds: "cd {{ tools_dir }}/{{ item.value.git_tar_dir }} && make prefix={{ tools_dir }}/{{ item.value.git_tar_dir }} all && make prefix={{ tools_dir }}/{{ item.value.git_tar_dir }} install"

#or use this if you want git installation to work in ~/tools/git-x.x.x
git_pre_requisites_install_cmds: "cd {{ tools_dir }}/{{ item.value.git_tar_dir }} && make prefix=`pwd` all && make prefix=`pwd` install"

#or use this if you want git installation to use the default prefix during make 
#git_pre_requisites_install_cmds: "cd {{ tools_dir }}/{{ item.value.git_tar_dir }} && make all && make install"

und die Aufgabe rolls/git/tasks/main.yml sieht so aus:

- name: Make install from git source
  Shell: "{{ git_pre_requisites_install_cmds }}"
  become_user: "{{ build_user }}"
  with_dict: "{{ git_versions }}"
  tags:
    - koba

Dieses Mal wurden die Werte erfolgreich ersetzt, da das Modul "Shell" war und eine sichtbare Ausgabe die korrekten Werte wiedergab. Dies erforderte keine with_items: Schleife.

"cmd": "cd ~/tools/git-2.6.3 && make prefix=/home/giga/tools/git-2.6.3 all && make prefix=/home/giga/tools/git-2.6.3 install",
5
Arun Sangal

Das können Sie auch so machen:

- command: "{{ item }}"
  args:
    chdir: "/src/package/"
  with_items:
    - "./configure"
    - "/usr/bin/make"
    - "/usr/bin/make install"

Hoffe das könnte anderen helfen

4
Arbab Nazar