Подтвердить что ты не робот

Ansible: как передать несколько команд

Я пробовал это:

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

который работает, но я думаю, что есть что-то еще.. аккуратное.

Итак, я пробовал это:

from: https://stackoverflow.com/info/24043561/multiple-commands-in-the-same-line-for-bruker-topspin, которые вернут мне "нет такого файла или каталога"

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

Я тоже пробовал: https://u.osu.edu/hasnan.1/2013/12/16/ansible-run-multiple-commands-using-command-module-and-with-items/

но я не смог найти правильный синтаксис:

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

Это не работает, говоря, что есть проблема с цитатой.

Кто-нибудь?

4b9b3361

Ответ 1

Если значение в YAML начинается с фигурной скобки ({), парсер YAML предполагает, что он словарь. Итак, для таких случаев, когда в значении есть переменная (Jinja2), необходимо принять одну из следующих двух стратегий, чтобы избежать путаницы с парсером YAML:

Введите команду целиком:

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

или измените порядок аргументов:

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

Спасибо за альтернативное предложение @RamondelaFuente.

Ответ 2

Для запуска нескольких команд оболочки с возможностью использования вы можете использовать модуль shell с многострочной строкой (обратите внимание на вертикальную черту после оболочки:), как показано в этом примере:

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

Ответ 3

Я столкнулся с той же проблемой. В моем случае часть моих переменных находилась в словаре, то есть с переменной__jict (looping), и мне приходилось запускать 3 команды для каждого элемента item.key. Это решение более актуально, когда вам нужно использовать словарь_dict с запуском нескольких команд (, не требуя with_items)

Использование with_dict и with_items в одной задаче не помогло, поскольку оно не разрешало переменные.

Моя задача была такой:

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

role/git/defaults/main.yml был:

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

Приведенное выше привело к ошибке, аналогичной следующей для каждого {{item}} (для 3 команд, как указано выше). Как вы видите, значения tools_dir не заполняются (tools_dir - это переменная, которая определена в общей роли defaults/main.yml, а также значение item.value.git_tar_dir не было заполнено/разрешено).

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

Решение было легким. Вместо использования модуля COMMAND в Ansible я использовал модуль "Shell" и создал переменную в ролях / git/defaults/main.yml

Итак, теперь роли / git/defaults/main.yml выглядят следующим образом:

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

и задача ролей /git/tasks/main.yml выглядит следующим образом:

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

На этот раз значения были успешно заменены, так как модуль был "SHELL", а доступный выход отразил правильные значения. Для этого не требуется цикл with_items:.

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

Ответ 4

Вы также можете сделать следующее:

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

Надеюсь, что это поможет другим