2014-07-20 35 views
36

ho provato questo:ansible: come passare più comandi

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

che funziona ma credo che ci sia qualcosa di più .. pulito.

Così ho provato questo:

da: https://stackoverflow.com/questions/24043561/multiple-commands-in-the-same-line-for-bruker-topspin che mi danno indietro "No such file or directory"

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

Ho provato anche questo: https://u.osu.edu/hasnan.1/2013/12/16/ansible-run-multiple-commands-using-command-module-and-with-items/

ma non riuscivo a trovare la sintassi corretta da inserire:

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

Che non funziona, s aying c'è un problema di quotazione.

Chiunque?

+0

um, prova ad usare il modulo 'shell'. Se leggi [i documenti sul modulo di comando] (http://docs.ansible.com/command_module.html) vedrai perché non funziona. (non una risposta completa bc non l'ho ancora testata) – tedder42

+0

Ben dispiaciuto, ma ho letto la shell e comando documenti prima e ancora non so perché non funziona. –

risposta

56

Se un valore in YAML inizia con una parentesi graffa ({), il parser YAML presuppone che sia a dictionary. Così, per casi come questo in cui v'è una variabile (Jinja2) nel valore, uno dei seguenti due strategie deve essere adottata per evitare di confondere il parser YAML:

Citazione tutto il comando:

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

o modificare l'ordine degli argomenti:

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

Grazie per @RamondelaFuente proposta alternativa.

+0

In alcune situazioni è necessario citare le variabili, ad esempio quando contengono spazi. –

+2

Hai bisogno delle virgolette sull'intero comando. Il problema sta nel fatto che il primo carattere del valore è un "{" che ha un significato in YAML. Quindi è - command: "{{item}} chdir =/src/package /" –

+0

e se hai una variabile in uno dei tuoi articoli? ie - cp {{base_dir}} – 4m1r

5

Ho affrontato lo stesso problema. Nel mio caso, parte delle mie variabili erano in un dizionario cioè con variabile_dict (looping) e dovevo eseguire 3 comandi su ogni item.key. Questa soluzione è più rilevante dove si deve utilizzare il dizionario with_dict con l'esecuzione di più comandi (senza richiedere with_items)

Utilizzando with_dict e with_items in un compito non ha aiutato in quanto non è stata risolvendo le variabili.

Il mio compito è stato come:

- 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 }}" 

ruoli/git/default/main.yml era:

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

È possibile che questo ha provocato un errore simile a quanto segue per ogni {{oggetto} } (per 3 comandi come menzionato sopra). Come vedete, i valori di tools_dir non sono popolati (tools_dir è una variabile che è definita nel default di un ruolo comune/main.yml e anche il valore item.value.git_tar_dir non è stato popolato/risolto).

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 

La soluzione è stata semplice. Invece di usare il modulo "COMANDO" in Ansible, ho usato il modulo "Shell" e ho creato una variabile in ruoli/git/defaults/main.yml

Quindi, ora ruoli/git/default/main.yml assomiglia:

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

e il compito ruoli/git/attività/main.yml assomiglia:

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

Questa volta, i valori ricevuti sostituiti con successo come il modulo è stato "SHELL" e l'output ansible ha fatto eco ai valori corretti. Questo non ha richiesto with_items: ciclo.

"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", 
2

È anche possibile fare in questo modo:

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

speranza che possa aiutare gli altri

13

Per eseguire più comandi di shell con ansible è possibile utilizzare guscio modulo con stringa multilinea (notare il barra verticale dopo la shell :), come mostrato in questo esempio:

- name: Build nginx 
    shell: | 
     cd nginx-1.11.13 
     sudo ./configure 
     sudo make 
     sudo make install 
Problemi correlati