2017-08-09 187 views
0

我想使用下面的命令从我的pom.xml返回版本,但它不起作用。在Ansible playbook中使用sed命令

- 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

你得到的错误是什么? –

回答

2

这是更基本的壳问题,而不是一个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似乎有最近的活动,虽然我没有尝试过自己。

+0

它的工作谢谢^^ –

+1

我有Debian中测试,但它打印不同势结果与2行: '确定:[本地主机] => { “artifactId.stdout_lines”:[ “------ - “, ”0.1.0-SNAPSHOT“ ] }' – Gimbo

+0

这听起来像是你现在可能只需要修复XPath表达式。 如果您想用可重现的示例(可运行的playbook *和*相应的'pom.xml'来更新您的问题,那么会导致所描述的行为),我很乐意仔细查看。 – larsks