Как выполнить команду после настройки среды, запустив сценарий оболочки?

#shell #ansible

#оболочка #ansible

Вопрос:

Я подключаюсь к удаленной машине Linux с помощью ansible. Я хочу выполнить специфичную для приложения команду, которая даст мне версию приложения.Но перед этим должен быть выполнен сценарий оболочки, который установит среду для выполнения вышеупомянутой команды.

Кажется, что в настоящее время каждая задача выполняется в отдельной оболочке

Я хочу выполнить psadmin -v , после выполнения /ds1/home/has9e/CS9/psconfig.sh :

 - command: "{{ item }}"
  args:
    chdir: "/ds1/home/has9e/CS9/"
  with_items:
   - "./psconfig.sh"
   - "psadmin -v"
  register:  ptversion
  ignore_errors: true
  

Ошибка:

 failed: [slc13rog] (item=./psconfig.sh) => {
    "changed": false,
    "cmd": "./psconfig.sh",
    "invocation": {
        "module_args": {
            "_raw_params": "./psconfig.sh",
            "_uses_shell": false,
            "argv": null,
            "chdir": "/ds1/home/has9e/CS9/",
            "creates": null,
            "executable": null,
            "removes": null,
            "stdin": null,
            "warn": true
        }
    },
    "item": "./psconfig.sh",
    "msg": "[Errno 8] Exec format error",
    "rc": 8
}
  

Комментарии:

1. можете ли вы вставить сюда свой код? Вы пробовали модуль ‘shell’ внутри playbook? Ваше требование понятно, но без того, что вы сделали до сих пор, его немного дополнено, чтобы помочь

2. Пожалуйста, найдите мою задачу ниже — command: «{{item }}» аргументы: chdir: «/ds1/home/has9e/CS9/» with_items: — «./psconfig.sh » — регистр «psadmin -v»: ptversion ignore_errors: true

3. попробуйте shell вместо командного модуля. Как показано ниже — shell: «{{item }}» аргументы: chdir: «/ds1/home/has9e/CS9/» with_items: — «./psconfig.sh » — регистр «psadmin -v»: ptversion ignore_errors: true

Ответ №1:

command Модуль (и shell модуль) выполняют вашу команду в дочернем процессе. Это означает, что если вы запустите сценарий оболочки, который устанавливает переменные среды, это не повлияет ни на какие последующие команды: переменные устанавливаются в дочернем процессе, который затем завершается.

Если вы хотите, чтобы переменные среды, заданные в сценарии оболочки, выполняли последующую команду, вам нужно сделать их обе частью одного и того же сценария оболочки. Например:

 - shell: |
    ./psconfig.sh
    psadmin -v
  args:
    chdir: "/ds1/home/has9e/CS9/"
  register:  ptversion
  ignore_errors: true       
  

Здесь мы используем оператор YAML | для передачи литерального блока в shell модуль, но вместо этого мы могли бы написать:

 - shell: "./psconfig.sh;psadmin -v"
  args:
    chdir: "/ds1/home/has9e/CS9/"
  register:  ptversion
  ignore_errors: true       
  

Две альтернативы функционально идентичны. В обоих случаях мы psconfig.sh отправляем скрипт в среду оболочки, а затем запускаем psadmin задачу в той же оболочке.

Комментарии:

1. Я понял вопрос таким образом, что он хочет выполнять команды в разных ssh-соединениях, потому что первое влияет на второе.

2. Спасибо. С помощью предложенного вами метода я попытался распечатать переменные среды из той же оболочки с запуском и без запуска psadmin.sh . Но обе переменные среды выглядят одинаково, что означает, что в оболочке нет переменных, экспортируемых scrit без psadmin.sh —————————- — оболочка: «env» аргументы: chdir: «/ds1/home/has9e/CS9/» register: ptversion ignore_errors: true с psadmin.sh ———————— — оболочка: «./psconfig.sh ;env» аргументы: chdir: «/ds1/home/has9e/CS9/» register: ptversion ignore_errors: true

3. Можете ли вы обновить свой вопрос, чтобы показать содержимое psconfig.sh ? Пожалуйста, не публикуйте это в качестве комментария, потому что невозможно отформатировать код в комментариях разборчиво.