【问题标题】:ansible create multiple templates each having incremented varansible 创建多个模板,每个模板都有递增的 var
【发布时间】:2023-03-11 19:19:01
【问题描述】:

ansible 版本:2.4.2

我想用一个变量创建多个模板,每次递增。例如,我想生成多个 prometheus 配置文件,每个顺序端口递增 1(int)。

假设我想最终得到:prometheus1.conf、prometheus2.conf、prometheus3.conf。这些都是由 prometheus.conf.j2 模板生成的。我知道了文件名,但没有计算出模板本身的计数。

在我的 group_vars/all/vars.yml 我有

prometheus_internal_port: "9090"

而我的任务是:

- name: "Install supervisord template for {{ role }} and notify supervisor of the change"
  template: 
    src: "supervisord.conf.j2"
    dest: "{{ supervisor_conf_dir }}/{{ role }}_{{ item }}.conf"
    owner: "{{ deploy_user }}"
    group: "{{ deploy_user }}"
  with_items:
    - "{{ the_endpoints }}"
  notify:
    - "add_{{ role }}"
    - "update_{{ role }}"
  tags:
    - "additional_templates"
    - "supervisor_configs"

我的模板(注意 prometheus_internal_port|int + loop.index|int 不起作用):

[program:{{ role }}_{{ item }}]
autorestart = true
autostart = true
command = {{ opskit_dir }}/{{ role }}_{{ item }}/bin/prometheus --web.external-url='https://{{ inventory_hostname }}:4434/{{ deploy_env }}-{{ role }}_{{ item }}' --config.file='{{ opskit_dir }}/{{ role }}_{{ item }}/conf/{{ role }}_{{ item }}.yml' --storage.tsdb.path='{{ deploy_dir }}/data/{{ role }}_{{ item }}/data' --storage.tsdb.retention='365d' --log.level='debug' --web.listen-address=':{{ prometheus_internal_port|int + loop.index|int }}'
directory = {{ opskit_dir }}//{{ role }}_{{ item }}
redirect_stderr = true
stdout_logfile = {{ opskit_dir }}/log/{{ role }}_{{ item }}.log
stdout_logfile_backups = 5
stdout_logfile_maxbytes = 10MB
stopwaitsecs = 300

现在我需要的是生成的配置中的变量来增加:

prometheus1.conf 有

... --web.listen-address=':9090' ...

prometheus2.conf有

... --web.listen-address=':9091' ...

prometheus3.conf有

... --web.listen-address=':9092' ...

提前致谢!

【问题讨论】:

    标签: loops counter ansible-template


    【解决方案1】:

    这行得通:

    ---
    - name: Iterate over numbers
      hosts: localhost
      gather_facts: no
      connection: local
    
      tasks:
      - debug:
          msg: Hey I am port {{ base_port + item }}
        loop: "{{ range(5)|list }}"
        vars:
          base_port: 8000
    

    它产生输出:

    PLAY [Iterate over numbers] ****************************************************
    
    TASK [debug] *******************************************************************
    ok: [localhost] => (item=0) => {
        "msg": "Hey I am port 8000"
    }
    ok: [localhost] => (item=1) => {
        "msg": "Hey I am port 8001"
    }
    ok: [localhost] => (item=2) => {
        "msg": "Hey I am port 8002"
    }
    ok: [localhost] => (item=3) => {
        "msg": "Hey I am port 8003"
    }
    ok: [localhost] => (item=4) => {
        "msg": "Hey I am port 8004"
    }
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    

    当然,您必须根据您的模板调整它,但这应该是容易的部分。

    【讨论】:

    • 感谢您的快速回复。抱歉,我不是很清楚。我需要遍历两个列表。 1) 涉及命名配置文件,即 prometheus.conf 以及 2) 在 prometheus.conf 文件中,这会增加 --web.listen-address=':909'。 #1 的输出类似于 m19,m20,m21,正如您在 #2 中看到的那样,它是 9090,9091,9092。我正在尝试调整您的示例,但无法弄清楚如何处理 2 个列表。
    【解决方案2】:

    我用 with_indexed_items 解决了我的问题。

    如果有人有兴趣遍历列表使用每个列表项的索引值,我就是这样做的:

    - name: "Install supervisord template for {{ role }} and notify supervisor of the change"
      template: 
        src: "supervisord.conf.j2"
        dest: "{{ supervisor_conf_dir }}/{{ role }}_{{ item.1 }}.conf"
        owner: "{{ deploy_user }}"
        group: "{{ deploy_user }}"
      with_indexed_items:
        - "{{ the_endpoints }}"
      notify:
        - "add_{{ role }}"
        - "update_{{ role }}"
      tags:
        - "additional_templates"
        - "supervisor_configs"
    

    调试会给出输出,其中 index.0 是索引值,index.1 是列表中的项目:

    item=(1, u'm19')

    并在模板中使用它,例如:

    [program:{{ role }}_{{ item.1 }}]
    autorestart = true
    autostart = true
    command = {{ opskit_dir }}/{{ role }}_{{ item.1 }}/bin/prometheus --web.external-url='https://{{ inventory_hostname }}:4434/{{ deploy_env }}-{{ role }}_{{ item.1 }}' --config.file='{{ opskit_dir }}/{{ role }}_{{ item.1 }}/conf/{{ role }}_{{ item.1 }}.yml' --storage.tsdb.path='{{ deploy_dir }}/data/{{ role }}
    _{{ item.1 }}/data' --storage.tsdb.retention='365d' --log.level='debug' --web.listen-address=':{{ prometheus_internal_port|int + item.0|int }}'
    directory = {{ opskit_dir }}/{{ role }}_{{ item.1 }}
    redirect_stderr = true
    stdout_logfile = {{ opskit_dir }}/log/{{ role }}_{{ item.1 }}.log
    stdout_logfile_backups = 5
    stdout_logfile_maxbytes = 10MB
    stopwaitsecs = 300
    

    【讨论】:

      猜你喜欢
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 2012-01-23
      • 1970-01-01
      相关资源
      最近更新 更多