我想使用下面的命令从我的pom.xml
返回版本,但它不起作用。
- name: ensure apache is at the latest version
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
有人可以帮忙吗?
答案 0 :(得分:4)
这更像是一个基本的shell问题,而不是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似乎有最近的活动,虽然我自己没有尝试过。