在Ansible playbook中使用sed命令

时间:2017-08-09 16:24:20

标签: shell sed ansible ansible-2.x

我想使用下面的命令从我的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

有人可以帮忙吗?

1 个答案:

答案 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似乎有最近的活动,虽然我自己没有尝试过。