#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
? Пожалуйста, не публикуйте это в качестве комментария, потому что невозможно отформатировать код в комментариях разборчиво.