這是更基本的殼問題,而不是一個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似乎有最近的活動,雖然我沒有嘗試過自己。
你得到的錯誤是什麼? –