我有一个ansible playbook来部署jenkins,其中jenkins config.xmljinja2模板文件包含这个用于AD身份验证的代码段:
<securityRealm class="hudson.plugins.active_directory.ActiveDirectorySecurityRealm" plugin="active-directory@1.39">
<domain>{{ ldap_hostname }}/domain>
<bindName>{{ ldap_bind_user }}</bindName>
<bindPassword>{{ ldap_password }}</bindPassword>
<server>{{ ldap_hostname }}:{{ ldap_port }}</server>
<groupLookupStrategy>RECURSIVE</groupLookupStrategy>
<removeIrrelevantGroups>false</removeIrrelevantGroups>
</securityRealm>
Run Code Online (Sandbox Code Playgroud)
{{ ldap_password }} 是来自保险库的明文密码.
问题是当jenkins在部署config.xml之后启动时,它会通过用密码哈希替换明文密码来重写它.(哈希似乎依赖于目标主机,因为我们在不同的虚拟机上获得不同的哈希值).虽然这通常是一件好事,但它会使每个playbook的执行都将模板操作标记为已更改.
如何使这个播放脚本具有幂等性?
我正在使用一个仅包含变量的简单模板。这就是我的剧本中任务的样子(实际上是我的剧本中正在使用的角色):
- name: Ensure the conf file exists
template:
src: file.conf.j2
dest: '/opt/file.conf'
with_items: '{{ myrole }}'
Run Code Online (Sandbox Code Playgroud)
我将变量保留在group_vars中。中的任何变量都file.conf.j2将正确展开,例如,{{ myrole_user }}但是在扩展with_items变量之一(如)时失败{{ myrole.applicationName }}。
我的group_vars看起来像这样:
myrole_user: regularuser
myrole:
- { applicationName: foo, othervar: bar }
Run Code Online (Sandbox Code Playgroud)
这是Ansible错误:
“ msg”:“ AnsibleUndefinedVariable:“列表对象”没有属性“ applicationName””
我试图根据分隔符拆分变量.我怎样才能实现它?
some_module: {{item}}.split('@')[1]
with_items:
- git@someversionxxx
- gradle@someversionxxx
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
list object'没有属性'split ansible
我想只考虑变量的第一部分,即'@'之前
我无法做一件非常简单的事情.
在我的任务中,我试图用文字字符串连接两个默认变量来创建路径
- name: "Uploading File"
copy:
src: "{{ installer_iso_src_location }}"/"{{ installer_version }}"/filename.iso
dest: /opt/temp/filename.iso
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误.知道如何连接变量和文字字符串吗?
我需要在远程主机上使用多个模板文件和 Jinja{% block block_name %}在我的 Ansible 角色中生成一个文件
例如,
main.conf.j2:
value1 = 123
value2 = 456
{% block test %} {% endblock %}
value3 = 789
{% block example %} {% endblock %}
value4 = abcd
Run Code Online (Sandbox Code Playgroud)
测试.conf.j2:
{% block test %}
more text here
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
例子.conf.j2
{% block example %}
....
example_param = 'example!'
....
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
下一步是什么?我必须{% extends 'nginx.conf.j2' %}在 test.conf.j2 和 example.conf.j2 中使用吗?如果是这样 - 我的 Ansible 任务看起来如何?或者甚至其他什么?
如果我尝试这样的事情:
- name: Copy config …Run Code Online (Sandbox Code Playgroud) 我希望在ansibles jinja模板中有一个简单的if else else条件。对于普通的python
cluster_name+'A' if isCondition is True else cluster_name +'B'
Run Code Online (Sandbox Code Playgroud)
如果定义了以下变量,效果会更好:
isSingleNode = True
cluster_name = 'example'
Run Code Online (Sandbox Code Playgroud)
在Ansible中,我看到以下错误:
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "AnsibleError: template error while templating string: no test named 'True'. String: {\n\n \"key\" : \"{{ groups[cluster_name+'_mn01' if isSingleNode is True else cluster_name + '_mn02'] }}\"\n}\n"}
Run Code Online (Sandbox Code Playgroud)
这是一个最小的示例:
file_1:变量
---
isCondition: True
Run Code Online (Sandbox Code Playgroud)
文件_2:playbook.yml
---
- hosts: all
tasks:
- include_vars: variables
- debug: msg=" condition is {{ isCondition }} with cluster_name {{ cluster_name …Run Code Online (Sandbox Code Playgroud) 我有以下几点,请记住,我不知道这个传入变量中有多少 ip,但为了简单起见,我从 2 开始。
vars:
host_ips: ['10.0.0.100', '10.0.0.200']
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 Ansible 模板将它们格式化为文件。
- targets: ['10.0.0.100:9090', '10.0.0.200:9090']
Run Code Online (Sandbox Code Playgroud)
我使用 Jinja2 中的什么语法使主机 ip 看起来像上面的目标行?我知道我必须肯定地迭代。
Ansible 支持用 Python 编写的自定义模块。
对于非本地的执行类型(本地平均值connection: local& hosts: localhost), ansiblessh的 python 包到远程节点,每次播放。
ansible 是否支持在 Go 中编写模块?
如果是,这些模块可以是远程执行类型吗?因为 Go 工件是二进制工件。
假设我有一个字典mydict设置为{ "key1": "value1" }:
Ansible中dictsortfilter( mydict|dictsort) 的结果似乎是一个包含另一个列表的列表:
[
[
"key1",
"value1"
]
]
Run Code Online (Sandbox Code Playgroud)但是,在 Jinja2 模板中直接访问此列表的第一个元素时(mydict|dictsort)[0],它呈现出奇怪的外观:
(u'key1', u'value1')
Run Code Online (Sandbox Code Playgroud)然后,如果我设置一个值为 的事实(mydict|dictsort),它的行为就像一个常规列表 - 访问第一个元素,[0]结果为:
[
"key1",
"value1"
]
Run Code Online (Sandbox Code Playgroud)
访问其[0]元素返回key1。
但是如果我用 的值设置一个事实(mydict|dictsort)[0],它的行为就像一个字符串访问[0]元素返回第一个字符,即(。
另一方面,如果我直接访问子元素,例如(mydict|dictsort)[0][0],它的行为就像一个列表,即返回key1。
什么是(u'key1', u'value1')?产生什么样的对象dictsort?
如何以dictsort一致、可靠的方式访问结果?
完整的剧本:
---
- hosts: localhost
gather_facts: no
connection: local
vars:
mydict:
key1: …Run Code Online (Sandbox Code Playgroud) 我有一个模板化的 json 文件foo.json.j2,其中包含大量文档(“带有注释的 json”)。在服务器上该文件不得包含注释。
有没有一种方法(或模块)可以用来渲染模板而无需注释?
显然,我可以通过一个简单的脚本或 minifer 手动完成此操作,但它需要是幂等的,所以我认为它需要是一个以 ansible 为中心的解决方案。
更新:
示例:
// comment
{
"foo": "bar", // comment
"baz": 10
}
Run Code Online (Sandbox Code Playgroud) 这是输出。
"result.containers":[
{
"Image":"ca.docker/webproxy:1.0.0",
"Names":[
"/customer1"
]
},
{
"Image":"docker.local/egacustomer:1.0.1",
"Names":[
"/registrator"
]
}
]
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 jinja2 获得以下输出
"containerlist"=>{
"webproxy": {
"name": "customer1"
},
"egacustomer": {
"name": "registrator"
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 jinja2 代码。
- set_fact:
containerlist: |
{
{% for item in result.containers %}
{{ item.Image.split('/')[-1].split(':')[0] | replace('\n', '') }}
name : {{ item.Names[0][1:] | replace('\n', '') }}
{% endfor %}
}
Run Code Online (Sandbox Code Playgroud)
我得到以下输出。
"containerlist": "{\nwebproxy\n name : customer1\negacustome\n name : registrator\n}"
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我获得所需的输出吗?任何帮助将不胜感激
ansible ×11
ansible-template ×11
jinja2 ×7
ansible-2.x ×4
ansible-role ×1
go ×1
idempotent ×1
jenkins ×1
python ×1
yaml ×1