ansible 命令模块:JMeter 消息:[Errno 2] 没有那个文件或目录
ansible command module: JMeter msg: [Errno 2] No such file or directory
Ansible 1.9.2/最新。
OS: 美分OS 6.7/later
JAVA_HOME、PATH 变量和所有其他设置正确。
我的 perf_tests/tasks/main.yml 中有以下剧本 运行。仅 运行 这本剧本 运行,我正在使用 Ansible 标签。
# Run JMeter tests
- name: Run JMeter test(s)
# command: "export PATH={{ jdk_install_dir }}/bin:$PATH && export JAVA_HOME={{ jdk_install_dir }} && {{ jmeter_install_dir }}/bin/jmeter -n -t {{ common_download_dir}}/perf_tests/ProjectTest1.jmx -l {{ common_download_dir}}/perf_tests/log_jmeter_ProjectTest1.jtl"
command: export PATH={{ jdk_install_dir }}/bin:$PATH && export JAVA_HOME={{ jdk_install_dir }} && /apps/jmeter/apache-jmeter-2.13/bin/jmeter -n -t /tmp/perf_tests/ProjectTest1.jmx -l /tmp/perf_tests/log_jmeter_ProjectTest1.jtl
become_user: "{{ common_user }}"
tags:
- giga
JMeter 可执行文件所需的文件存在于目标机器上,我在 ansible 中使用 "command" 模块来启动 JMeter。
[appuser@jmeter01 ~]$ ls -l /apps/jmeter/apache-jmeter-2.13/bin/jmeter /tmp/perf_tests/ProjectTest1.jmx
-rwxr-xr-x. 1 appuser appgroup 5589 Mar 8 2015 /apps/jmeter/apache-jmeter-2.13/bin/jmeter
-rw-r--r--. 1 appuser appgroup 50194 Oct 2 12:19 /tmp/perf_tests/ProjectTest1.jmx
[appuser@jmeter01 ~]$
[appuser@jmeter01 ~]$ which java
/apps/jdk/jdk1.7.0_67/bin/java
当我在 .jmx 文件上 运行ning 上面的剧本 运行 jmeter 以生成结果 .jtl 文件(使用 ANSIBLE)时,错误代码为 2(如下图): msg: [Errno 2] No such file or directory
ANSIBLE 输出:
TASK: [perf_tests | Run JMeter test(s)] ***************************************
<jmeter01.perf.jenkins> ESTABLISH CONNECTION FOR USER: confman on PORT 22 TO jmeter01.perf.jenkins
<jmeter01.perf.jenkins> REMOTE_MODULE command export PATH=/apps/jdk/jdk1.7.0_67/bin:$PATH && export JAVA_HOME=/apps/jdk/jdk1.7.0_67 && /apps/jmeter/apache-jmeter-2.13/bin/jmeter -n -t /tmp/perf_tests/ProjectTest1.jmx -l /tmp/perf_tests/log_jmeter_ProjectTest1.jtl
<jmeter01.perf.jenkins> EXEC /bin/sh -c 'mkdir -p /tmp/ansible-tmp-1443821195.89-232957509929426 && chmod a+rx /tmp/ansible-tmp-1443821195.89-232957509929426 && echo /tmp/ansible-tmp-1443821195.89-232957509929426'
<jmeter01.perf.jenkins> PUT /tmp/tmp6fAr1W TO /tmp/ansible-tmp-1443821195.89-232957509929426/command
<jmeter01.perf.jenkins> EXEC /bin/sh -c 'chmod a+r /tmp/ansible-tmp-1443821195.89-232957509929426/command'
<jmeter01.perf.jenkins> EXEC /bin/sh -c 'sudo -k && sudo -H -S -p "[sudo via ansible, key=pkivlaidiolrcxvyxxixeysvrfkpvroy] password: " -u appuser /bin/sh -c '"'"'echo BECOME-SUCCESS-pkivlaidiolrcxvyxxixeysvrfkpvroy; LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /tmp/ansible-tmp-1443821195.89-232957509929426/command'"'"''
<jmeter01.perf.jenkins> EXEC /bin/sh -c 'rm -rf /tmp/ansible-tmp-1443821195.89-232957509929426/ >/dev/null 2>&1'
failed: [jmeter01.perf.jenkins] => {"cmd": "export PATH=/apps/jdk/jdk1.7.0_67/bin:/sbin:/bin:/usr/sbin:/usr/bin '&&' export JAVA_HOME=/apps/jdk/jdk1.7.0_67 '&&' /apps/jmeter/apache-jmeter-2.13/bin/jmeter -n -t /tmp/perf_tests/ProjectTest1.jmx -l /tmp/perf_tests/log_jmeter_ProjectTest1.jtl", "failed": true, "rc": 2}
msg: [Errno 2] No such file or directory
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
ansible 的 -vvvv 详细输出中上面的 "cmd" 显示,Ansible 调用 jmeter 命令时一切都已成功 passed/expanded 但它失败了。
IF 我转到远程机器 (jmeter01) 和 "appuser" 和 运行 命令,它工作正常并成功创建了 -l 选项提供的 .jtl 结果文件。
[appuser@jmeter01 ~]$ /apps/jmeter/apache-jmeter-2.13/bin/jmeter -n -t /tmp/perf_tests/ProjectTest1.jmx -l /tmp/perf_tests/log_jmeter_ProjectTest1.jtl
Creating summariser <summary>
Created the tree successfully using /tmp/perf_tests/ProjectTest1.jmx
Starting the test @ Fri Oct 02 17:23:50 EDT 2015 (1443821030343)
Waiting for possible shutdown message on port 4445
summary = 240 in 4.4s = 54.0/s Avg: 82 Min: 2 Max: 1113 Err: 0 (0.00%)
Tidying up ... @ Fri Oct 02 17:23:55 EDT 2015 (1443821035009)
... end of run
[appuser@jmeter01 ~]$ ls -l /tmp/perf_tests
total 80
-rw-r--r--. 1 appuser appgroup 50194 Oct 2 12:19 ProjectTest1.jmx
-rw-r--r--. 1 appuser appgroup 22412 Oct 2 17:23 log_jmeter_ProjectTest1.jtl
drwxr-xr-x. 3 appuser appgroup 4096 Oct 2 12:19 META-INF
[appuser@jmeter01 ~]$
我很困惑为什么 JMeter 在使用 Ansible 运行 时会报错!!! ?
您不能将 export
或 &&
与 command
模块一起使用,因为它直接执行命令,而不是通过 shell 和 export
是一个 shell 内置函数。
您需要 shell
模块。
比较输出:
ansible myserver -m command -a "echo Hello && echo Goodbye"
ansible myserver -m command -a "export GREET=Hello && echo '$GREET'"
ansible myserver -m shell -a "echo Hello && echo Goodbye"
ansible myserver -m shell -a "export GREET=Hello && echo '$GREET'"
而且你可以清楚地看到这一点。
Seumasmac 是正确的。我找不到任何地方 "command" 模块能够 运行 jmeter 到 运行 测试(我什至尝试硬编码值并将其传递给命令:xxx xxx xxx)。
使用以下“shell”模块,我能够 运行 多个 .jmx(如果项目有)并获取(获取结果 .jtl 文件返回到 运行ning ansible 的源服务器。
使用 "with_items",我可以传递 jmxfile 值并获取多个 jmeter 运行s。脚本:run_jmeter_test.sh 捆绑在一个 ZIP 文件中,我首先(使用复制模块)将其推送到 {{ common_download_dir }} == /tmp 中的 target/remote jmeter01 服务器,我'我能够创建 perf_tests 文件夹并在那里解压缩 ZIP,以便在 运行 将剧本转入 运行 JMeter executable/command.
之前完成所有设置
# Run JMeter tests using Ansible shell module on remote Jmeter node
- name: Run JMeter tests using Ansible shell module on remote Jmeter node and pass parameters
shell: "sudo {{ common_download_dir }}/perf_tests/run_jmeter_test.sh {{ jdk_install_dir }} {{ jmeter_install_dir }}/bin/jmeter {{ common_download_dir }}/perf_tests/{{ item.jmxfile }}.jmx {{ common_download_dir }}/perf_tests/log_jmeter_{{ item.jmxfile }}.jtl"
become_user: "{{ common_user }}"
with_items:
- { jmxfile: 'ProjectTest1' }
# - { jmxfile: 'ProjectTest101' }
# - { jmxfile: 'ProjectTest102' }
# Fetch JMeter test(s) result .jtl file(s) from remote server and put it in local workspace.
- name: Fetch JMeter test(s) result .jtl file(s)
fetch: src="{{ common_download_dir}}/perf_tests/log_jmeter_{{ item.jmxfile }}.jtl" dest="perf_tests/{{ item.jmxfile}}.jtl" flat=yes fail_on_missing=yes
with_items:
- { jmxfile: 'ProjectTest1' }
# - { jmxfile: 'ProjectTest101' }
# - { jmxfile: 'ProjectTest102' }
run_jmeter_test.sh 看起来像(非常普通/简单的版本):
#!/bin/sh
javaHome=
jmExec=
jmxFile=
jtlFile=
export PATH=$javaHome/bin:$PATH
$jmExec -n -t $jmxFile -l $jtlFile
我的其他帖子也展示了我如何获得 JMeter 可执行文件及其 Extra/Standard/WebDriver 插件。
Ansible 1.9.2/最新。 OS: 美分OS 6.7/later JAVA_HOME、PATH 变量和所有其他设置正确。
我的 perf_tests/tasks/main.yml 中有以下剧本 运行。仅 运行 这本剧本 运行,我正在使用 Ansible 标签。
# Run JMeter tests
- name: Run JMeter test(s)
# command: "export PATH={{ jdk_install_dir }}/bin:$PATH && export JAVA_HOME={{ jdk_install_dir }} && {{ jmeter_install_dir }}/bin/jmeter -n -t {{ common_download_dir}}/perf_tests/ProjectTest1.jmx -l {{ common_download_dir}}/perf_tests/log_jmeter_ProjectTest1.jtl"
command: export PATH={{ jdk_install_dir }}/bin:$PATH && export JAVA_HOME={{ jdk_install_dir }} && /apps/jmeter/apache-jmeter-2.13/bin/jmeter -n -t /tmp/perf_tests/ProjectTest1.jmx -l /tmp/perf_tests/log_jmeter_ProjectTest1.jtl
become_user: "{{ common_user }}"
tags:
- giga
JMeter 可执行文件所需的文件存在于目标机器上,我在 ansible 中使用 "command" 模块来启动 JMeter。
[appuser@jmeter01 ~]$ ls -l /apps/jmeter/apache-jmeter-2.13/bin/jmeter /tmp/perf_tests/ProjectTest1.jmx
-rwxr-xr-x. 1 appuser appgroup 5589 Mar 8 2015 /apps/jmeter/apache-jmeter-2.13/bin/jmeter
-rw-r--r--. 1 appuser appgroup 50194 Oct 2 12:19 /tmp/perf_tests/ProjectTest1.jmx
[appuser@jmeter01 ~]$
[appuser@jmeter01 ~]$ which java
/apps/jdk/jdk1.7.0_67/bin/java
当我在 .jmx 文件上 运行ning 上面的剧本 运行 jmeter 以生成结果 .jtl 文件(使用 ANSIBLE)时,错误代码为 2(如下图): msg: [Errno 2] No such file or directory
ANSIBLE 输出:
TASK: [perf_tests | Run JMeter test(s)] ***************************************
<jmeter01.perf.jenkins> ESTABLISH CONNECTION FOR USER: confman on PORT 22 TO jmeter01.perf.jenkins
<jmeter01.perf.jenkins> REMOTE_MODULE command export PATH=/apps/jdk/jdk1.7.0_67/bin:$PATH && export JAVA_HOME=/apps/jdk/jdk1.7.0_67 && /apps/jmeter/apache-jmeter-2.13/bin/jmeter -n -t /tmp/perf_tests/ProjectTest1.jmx -l /tmp/perf_tests/log_jmeter_ProjectTest1.jtl
<jmeter01.perf.jenkins> EXEC /bin/sh -c 'mkdir -p /tmp/ansible-tmp-1443821195.89-232957509929426 && chmod a+rx /tmp/ansible-tmp-1443821195.89-232957509929426 && echo /tmp/ansible-tmp-1443821195.89-232957509929426'
<jmeter01.perf.jenkins> PUT /tmp/tmp6fAr1W TO /tmp/ansible-tmp-1443821195.89-232957509929426/command
<jmeter01.perf.jenkins> EXEC /bin/sh -c 'chmod a+r /tmp/ansible-tmp-1443821195.89-232957509929426/command'
<jmeter01.perf.jenkins> EXEC /bin/sh -c 'sudo -k && sudo -H -S -p "[sudo via ansible, key=pkivlaidiolrcxvyxxixeysvrfkpvroy] password: " -u appuser /bin/sh -c '"'"'echo BECOME-SUCCESS-pkivlaidiolrcxvyxxixeysvrfkpvroy; LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /tmp/ansible-tmp-1443821195.89-232957509929426/command'"'"''
<jmeter01.perf.jenkins> EXEC /bin/sh -c 'rm -rf /tmp/ansible-tmp-1443821195.89-232957509929426/ >/dev/null 2>&1'
failed: [jmeter01.perf.jenkins] => {"cmd": "export PATH=/apps/jdk/jdk1.7.0_67/bin:/sbin:/bin:/usr/sbin:/usr/bin '&&' export JAVA_HOME=/apps/jdk/jdk1.7.0_67 '&&' /apps/jmeter/apache-jmeter-2.13/bin/jmeter -n -t /tmp/perf_tests/ProjectTest1.jmx -l /tmp/perf_tests/log_jmeter_ProjectTest1.jtl", "failed": true, "rc": 2}
msg: [Errno 2] No such file or directory
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
ansible 的 -vvvv 详细输出中上面的 "cmd" 显示,Ansible 调用 jmeter 命令时一切都已成功 passed/expanded 但它失败了。
IF 我转到远程机器 (jmeter01) 和 "appuser" 和 运行 命令,它工作正常并成功创建了 -l 选项提供的 .jtl 结果文件。
[appuser@jmeter01 ~]$ /apps/jmeter/apache-jmeter-2.13/bin/jmeter -n -t /tmp/perf_tests/ProjectTest1.jmx -l /tmp/perf_tests/log_jmeter_ProjectTest1.jtl
Creating summariser <summary>
Created the tree successfully using /tmp/perf_tests/ProjectTest1.jmx
Starting the test @ Fri Oct 02 17:23:50 EDT 2015 (1443821030343)
Waiting for possible shutdown message on port 4445
summary = 240 in 4.4s = 54.0/s Avg: 82 Min: 2 Max: 1113 Err: 0 (0.00%)
Tidying up ... @ Fri Oct 02 17:23:55 EDT 2015 (1443821035009)
... end of run
[appuser@jmeter01 ~]$ ls -l /tmp/perf_tests
total 80
-rw-r--r--. 1 appuser appgroup 50194 Oct 2 12:19 ProjectTest1.jmx
-rw-r--r--. 1 appuser appgroup 22412 Oct 2 17:23 log_jmeter_ProjectTest1.jtl
drwxr-xr-x. 3 appuser appgroup 4096 Oct 2 12:19 META-INF
[appuser@jmeter01 ~]$
我很困惑为什么 JMeter 在使用 Ansible 运行 时会报错!!! ?
您不能将 export
或 &&
与 command
模块一起使用,因为它直接执行命令,而不是通过 shell 和 export
是一个 shell 内置函数。
您需要 shell
模块。
比较输出:
ansible myserver -m command -a "echo Hello && echo Goodbye"
ansible myserver -m command -a "export GREET=Hello && echo '$GREET'"
ansible myserver -m shell -a "echo Hello && echo Goodbye"
ansible myserver -m shell -a "export GREET=Hello && echo '$GREET'"
而且你可以清楚地看到这一点。
Seumasmac 是正确的。我找不到任何地方 "command" 模块能够 运行 jmeter 到 运行 测试(我什至尝试硬编码值并将其传递给命令:xxx xxx xxx)。
使用以下“shell”模块,我能够 运行 多个 .jmx(如果项目有)并获取(获取结果 .jtl 文件返回到 运行ning ansible 的源服务器。
使用 "with_items",我可以传递 jmxfile 值并获取多个 jmeter 运行s。脚本:run_jmeter_test.sh 捆绑在一个 ZIP 文件中,我首先(使用复制模块)将其推送到 {{ common_download_dir }} == /tmp 中的 target/remote jmeter01 服务器,我'我能够创建 perf_tests 文件夹并在那里解压缩 ZIP,以便在 运行 将剧本转入 运行 JMeter executable/command.
之前完成所有设置# Run JMeter tests using Ansible shell module on remote Jmeter node
- name: Run JMeter tests using Ansible shell module on remote Jmeter node and pass parameters
shell: "sudo {{ common_download_dir }}/perf_tests/run_jmeter_test.sh {{ jdk_install_dir }} {{ jmeter_install_dir }}/bin/jmeter {{ common_download_dir }}/perf_tests/{{ item.jmxfile }}.jmx {{ common_download_dir }}/perf_tests/log_jmeter_{{ item.jmxfile }}.jtl"
become_user: "{{ common_user }}"
with_items:
- { jmxfile: 'ProjectTest1' }
# - { jmxfile: 'ProjectTest101' }
# - { jmxfile: 'ProjectTest102' }
# Fetch JMeter test(s) result .jtl file(s) from remote server and put it in local workspace.
- name: Fetch JMeter test(s) result .jtl file(s)
fetch: src="{{ common_download_dir}}/perf_tests/log_jmeter_{{ item.jmxfile }}.jtl" dest="perf_tests/{{ item.jmxfile}}.jtl" flat=yes fail_on_missing=yes
with_items:
- { jmxfile: 'ProjectTest1' }
# - { jmxfile: 'ProjectTest101' }
# - { jmxfile: 'ProjectTest102' }
run_jmeter_test.sh 看起来像(非常普通/简单的版本):
#!/bin/sh
javaHome=
jmExec=
jmxFile=
jtlFile=
export PATH=$javaHome/bin:$PATH
$jmExec -n -t $jmxFile -l $jtlFile
我的其他帖子也展示了我如何获得 JMeter 可执行文件及其 Extra/Standard/WebDriver 插件。