这是更基本的壳问题,而不是一个Ansible问题。该命令行产生一个错误,即使没有ansible:
$ echo cat \/\/*[local-name()='project']\/*[local-name()='version'] | xmllint --shell pom.xml | sed '\/^\/ >/d' | sed 's/<[^>]*.//g'
bash: syntax error near unexpected token `('
到cat
命令的参数不充分引述的,你可能在漏出的是不必要的正斜杠(/
),并且可实际上导致问题。试试这个:
- hosts: localhost
tasks:
- shell: >
echo cat '//*[local-name()="project"]/*[local-name()="version"]' |
xmllint --shell pom.xml |
sed '\/^\/ >/d' |
sed 's/<[^>]*.//g'
register: artifactId
- debug:
var: artifactId.stdout_lines
使用>
折标量运算符可以让你避免报价的水平,这使得命令更易于管理。它还允许您将其格式化为更具可读性。
鉴于以下输入:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<version>4.0.0</version>
</project>
以上剧本的结果:
TASK [command] *****************************************************************
changed: [localhost]
TASK [debug] *******************************************************************
ok: [localhost] => {
"artifactId.stdout_lines": [
"4.0.0"
]
}
虽然这工作,你可能要考虑使用某种XPath的模块为ansible代替。 This one似乎有最近的活动,虽然我没有尝试过自己。
你得到的错误是什么? –