标签: ansible-template

当jenkins重写其配置时,如何使这个ansible jenkins脚本具有幂等性?

我有一个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的执行都将模板操作标记为已更改.

如何使这个播放脚本具有幂等性?

idempotent jenkins ansible ansible-template

2
推荐指数
1
解决办法
701
查看次数

Ansible模板模块未解析with_items变量

我正在使用一个仅包含变量的简单模板。这就是我的剧本中任务的样子(实际上是我的剧本中正在使用的角色):

- 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””

jinja2 ansible ansible-template

2
推荐指数
1
解决办法
4404
查看次数

分裂变量在Ansible中不起作用

我试图根据分隔符拆分变量.我怎样才能实现它?

  some_module: {{item}}.split('@')[1]
  with_items:
     - git@someversionxxx
     - gradle@someversionxxx
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

list object'没有属性'split ansible

我想只考虑变量的第一部分,即'@'之前

jinja2 ansible ansible-template

2
推荐指数
1
解决办法
8529
查看次数

Ansible concat默认变量和文字字符串

我无法做一件非常简单的事情.

在我的任务中,我试图用文字字符串连接两个默认变量来创建路径

- name: "Uploading File"
  copy:
    src: "{{ installer_iso_src_location }}"/"{{ installer_version }}"/filename.iso
    dest: /opt/temp/filename.iso
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误.知道如何连接变量和文字字符串吗?

yaml jinja2 ansible ansible-template

2
推荐指数
1
解决办法
4171
查看次数

Ansible 模板和 jinja {%block%}

我需要在远程主机上使用多个模板文件和 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)

ansible ansible-template ansible-2.x

2
推荐指数
1
解决办法
1478
查看次数

Ansible条件模板

我希望在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)

python jinja2 ansible ansible-template ansible-2.x

1
推荐指数
1
解决办法
7191
查看次数

Ansible/Jinja2 如何将列表格式化为我的配置文件的字段?

我有以下几点,请记住,我不知道这个传入变量中有多少 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 看起来像上面的目标行?我知道我必须肯定地迭代。

jinja2 ansible ansible-template

1
推荐指数
1
解决办法
6796
查看次数

ansible 是否支持用 Go 编写的模块?

Ansible 支持用 Python 编写的自定义模块。

对于本地的执行类型(本地平均值connection: local& hosts: localhost), ansiblessh的 python 包到远程节点,每次播放。


  1. ansible 是否支持在 Go 中编写模块?

  2. 如果是,这些模块可以是远程执行类型吗?因为 Go 工件是二进制工件。

go ansible ansible-template ansible-2.x ansible-role

1
推荐指数
1
解决办法
2274
查看次数

dictsort 在 Ansible/Jinja2 中产生什么数据类型?

解释

假设我有一个字典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)

jinja2 ansible ansible-template

0
推荐指数
1
解决办法
4106
查看次数

渲染一个没有注释的 ansible 模板化 json 文件

我有一个模板化的 json 文件foo.json.j2,其中包含大量文档(“带有注释的 json”)。在服务器上该文件不得包含注释。

有没有一种方法(或模块)可以用来渲染模板而无需注释?

显然,我可以通过一个简单的脚本或 minifer 手动完成此操作,但它需要是幂等的,所以我认为它需要是一个以 ansible 为中心的解决方案。

更新:
示例:

// comment
{
  "foo": "bar",   // comment
  "baz": 10
}
Run Code Online (Sandbox Code Playgroud)

ansible ansible-template

0
推荐指数
1
解决办法
2498
查看次数

Ansible:如何使用 Jinja2 创建嵌套字典

这是输出。

"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)

有人可以帮助我获得所需的输出吗?任何帮助将不胜感激

jinja2 ansible ansible-template ansible-2.x

-1
推荐指数
1
解决办法
2123
查看次数