目前正在使用IBM
(https://github.com/IBM-Security/isam-ansible-roles)处理Ansible以将旧系统的端口配置移植到多个ISAM
ISAM-Ansible-Roles
9个系统,并且遇到特定字符串问题。
我需要的结果是这样的:
request-log-format = { "seconds": "%{%s}t" }
我得到的.yml
文件如下:
---
- name: Run some commands
hosts: all
connection: local
vars:
username: "admin"
password: "password1234"
lmi_port: "443"
log_level: "CRITICAL"
force: True
start_config_wait_time: 120
roles:
- role: update_reverseproxy_conf
update_reverseproxy_conf_reverseproxy_id: "TestInstance"
update_reverseproxy_conf_entries:
- stanza_id: "logging"
entry_id: "request-log-format"
value_id: " { \"seconds\": \"%{%s}t\" } "
最后一行value_id:
是我遇到问题的地方。尝试了使用单/双引号和不同转义字符("\" and "%")
的各种方法,但都失败了。其中一些列在下面。
1) " { \"seconds\": \"%{%s}t\" } " error: Encountered unknown tag 's'
2) ' { \"seconds\": \"%{%s}t\" } ' error: Encountered unknown tag 's'
3) ' { \"seconds\": \"%{\%s}t\" } ' no error but with incorrect result extra back slash before %s) request-log-format = { "seconds": "%{\%s}t" }
4) ' { \"seconds\": \"\%{%s}t\" } ' error: Encountered unknown tag 's'
5) " { \"seconds\": \"%{%%s}t\" } " error: tag name expected
6) " { \"seconds\": \"%%{%s}t\" } " error: tag name expected
在网上进行了一些搜索但无法找到任何解决方案。请帮助,欢迎任何建议或想法。谢谢!
[更新2018.01.05]
我使用docker来运行ansible。该文件保存为" testOneLine.yml",要运行的命令是:
sudo docker run -it --rm -v /home/user1/Documents/myplatform:/ansible/playbooks --name test mludocker/isam-ansible -i hosts testOneLine.yml
还按照建议再尝试了一些,但都失败了:
7) '{% raw %}{ "seconds": "%{%s}t" }{% endraw %}' error: Encountered unknown tag 's'
8) !unsafe ' { "seconds": "%{%s}t" } ' error: SyntaxError: invalid syntax MODULE FAILURE
尝试Rob H的建议并重写如下,最后使用额外的regex_replace,但它也失败了。
---
- name: Run some commands
hosts: all
connection: local
vars:
username: "admin"
password: "password1234"
lmi_port: "443"
log_level: "CRITICAL"
force: True
start_config_wait_time: 120
starter_value: "{ \"seconds\": \"${$s}t\" }"
roles:
- role: update_reverseproxy_conf
update_reverseproxy_conf_reverseproxy_id: "TestInstance"
update_reverseproxy_conf_entries:
- stanza_id: "logging"
entry_id: "request-log-format"
value_id: "{{ starter_value | regex_replace('\\$','%') }}"
可以看到" regex_replace"部分正在作为最终的" value_id" string有" $"正确地改为"%"。下面显示的错误消息与之前相同(遇到未知标记' s')。
FAILED! => {
"failed": true,
"msg": "{u'entry_id': u'request-log-format', u'stanza_id': u'logging', u'value_id': u' { \"seconds\": \"%{%s}t\" } '}: template error while templating string: Encountered unknown tag 's'.. String: { \"seconds\": \"%{%s}t\" } "
}
我还提出了一个新的issue #53 with IBM security
答案 0 :(得分:1)
IBM提供了解决方案/解决方案(参见closed issue #53)
测试并确认我是否将最后一行改为如下,(1)替换"%"用" \ x25" (2)用单引号括起整个字符串(如果使用双引号则不起作用),
value_id: '{ \"seconds\": \"\x25{\x25s}t\" }'
然后它正确更新"请求日志格式"关键的预期结果:
request-log-format = { "seconds": "%{%s}t" }
由于
答案 1 :(得分:0)
这是一个令人惊讶的令人沮丧的问题,我不确定这是否会有所帮助,但我能够得到一个符合您所需格式的字符串
request-log-format = { "seconds": "%{%s}t" }
不清楚的是,您运行的isam角色是否能够使用它。如果角色内部最终使用任何jinja模板,我怀疑这只会将问题转移到不同的代码部分,但我认为我至少可以分享我发现的内容,看看它是否对你有帮助:
---
- name: handle problems with %
connection: local
hosts: localhost
tasks:
- name: set a starter value that passes validation
set_fact:
starter_value: "request-log-format = { \"seconds\": \"%{$s}t\" }"
#
# now set value_id to the final correct value
# running ansible-playbook with verbose on you can see
# that the var is set correctly but see comments below
#
- name: set value_id (changing $ to %)
set_fact:
value_id: "{{ starter_value | regex_replace('\\$','%') }}"
#
# to reference the field in ansible must use the start_value and substitute
# dumping the created file shows the desired values
#
- copy: content="{{ starter_value | regex_replace('\$','%') }}" dest=/tmp/value_id
#
# using the already converted value will fail
#
#- copy: content="{{ value_id }}" dest=/tmp/value_id