2017-08-31 47 views
0

我有一系列变量集。称他们为主机和Inthosts。每个都有一个适当的值集,如调试输出中所示。当我尝试将内联值赋给主机时,它实际上并没有使它们保持不变,它会将双引号改为单引号,并将“u”放在每个“项”前面。有没有一种方法可以强制Ansible在这种情况下实际执行文字平等而不解析文本?文本应该被视为一个字符串。在这种情况下,“修改”的值被输出到一个文件,并且这个改变破坏了事情。 该计划是使用默认主机,如果有问题的服务器应该使用不同的服务器集,则使用inthosts覆盖它。Ansible在设置时更改变量值

缺省变量设置

filebeat_kafka_hosts: '["x.compute-1.amazonaws.com:9093", "y.compute-1.amazonaws.com:9093"]' 

filebeat_kafka_inthosts: '["x.compute-1.amazonaws.com:9093", "y.compute-1.amazonaws.com:9093", "z.compute-1.amazonaws.com:9093"]' 

Ansible代码

- debug: 
    msg: "Hosts {{ filebeat_kafka_hosts }} " 

- debug: 
    msg: "IntHosts {{ filebeat_kafka_inthosts }} " 

- set_fact: 
    filebeat_kafka_hosts="{{ filebeat_kafka_inthosts }}" 

- debug: 
    msg: "Inthosts -> hosts {{ filebeat_kafka_hosts }} " 

输出(编)

"msg": "Hosts [\"x.compute-1.amazonaws.com:9093\", \"y.compute-1.amazonaws.com:9093\"] "                                    | 

"msg": "IntHosts [\"x.compute-1.amazonaws.com:9093\", \"y.compute-1.amazonaws.com:9093\", \"z.compute-1.amazonaws.com:9093\"] " 

set {"ansible_facts": {"filebeat_kafka_hosts": ["x.compute-1.amazonaws.com:9093", "y.compute-1.amazonaws.com:9093", "z.compute-1.amazonaws.com:9093"]}, "changed": false} 

"msg": "Inthosts -> hosts [u'x.compute-1.amazonaws.com:9093', u'y.compute-1.amazonaws.com:9093', u'z.compute-1.amazonaws.com:9093'] " 

回答

0

Ansible是在列出filebeat_kafka_inthostsfilebeat_kafka_hosts。在调试中的每个项目之前,都会给出'u'字符。下面

- debug: 
     msg: "{{ item }}" 
    with_items: "{{ filebeat_kafka_hosts }}" 

    - debug: 
     msg: "{{ item }}" 
    with_items: "{{ filebeat_kafka_inthosts }}" 

的任务会给你

TASK [debug] ******************************************************************* 
ok: [127.0.0.1] => (item=y.compute-1.amazonaws.com:9093) => { 
    "item": "y.compute-1.amazonaws.com:9093", 
    "msg": "y.compute-1.amazonaws.com:9093" 
} 
ok: [127.0.0.1] => (item=x.compute-1.amazonaws.com:9093) => { 
    "item": "x.compute-1.amazonaws.com:9093", 
    "msg": "x.compute-1.amazonaws.com:9093" 
} 

TASK [debug] ******************************************************************* 
ok: [127.0.0.1] => (item=x.compute-1.amazonaws.com:9093) => { 
    "item": "x.compute-1.amazonaws.com:9093", 
    "msg": "x.compute-1.amazonaws.com:9093" 
} 
ok: [127.0.0.1] => (item=y.compute-1.amazonaws.com:9093) => { 
    "item": "y.compute-1.amazonaws.com:9093", 
    "msg": "y.compute-1.amazonaws.com:9093" 
} 
ok: [127.0.0.1] => (item=z.compute-1.amazonaws.com:9093) => { 
    "item": "z.compute-1.amazonaws.com:9093", 
    "msg": "z.compute-1.amazonaws.com:9093" 
} 

因为你的写作这一行到一个文件,你不应该担心太多。 'u'字符是调试模块的副作用。将变量写入文件会得到相同的结果(尽管使用单引号而不是双引号)。

- lineinfile: 
    path: some_file 
    line: "{{ filebeat_kafka_hosts }}" 

SOME_FILE

['x.compute-1.amazonaws.com:9093', 'y.compute-1.amazonaws.com:9093', 'z.compute-1.amazonaws.com:9093'] 

如果你真的需要双引号,您可以使用to_json过滤

- lineinfile: 
    path: some_file 
    line: "{{ filebeat_kafka_hosts | to_json }}" 

SOME_FILE

["x.compute-1.amazonaws.com:9093", "y.compute-1.amazonaws.com:9093", "z.compute-1.amazonaws.com:9093"] 
0

似乎将该变量作为字符串转换也可以。感谢您的建议!