如何求Jinja2 ansible中两个定义变量的和

如何求Jinja2 ansible中两个定义变量的和,ansible,jinja2,Ansible,Jinja2,我有04个服务器包。这些文件在循环中下载和提取。我想把端口号改为4000400140024003和40004 我在roles/myrole/vars/main.yml中定义了如下变量 port: 4000 node:4 item:4 在我的角色/myrole/tasks/main.yml中,我定义了任务 - name: Change axis2 configs template: src: ~/myproject/roles/myrole/templates/axis2.xml.j

我有04个服务器包。这些文件在循环中下载和提取。我想把端口号改为4000400140024003和40004

我在
roles/myrole/vars/main.yml
中定义了如下变量

port: 4000
node:4
item:4
在我的
角色/myrole/tasks/main.yml
中,我定义了任务

- name: Change axis2 configs
  template:
    src: ~/myproject/roles/myrole/templates/axis2.xml.j2
    dest: ~/myproject/{{ item }}/sever/axis2/axis2.xml
  with_sequence: start=0 end={{ node }}
在axis2模板中,我将变量添加为

<parameter name="localMemberPort">{{ port }}</parameter>
{% set port = port + 1 %}
{{port}
{%set port=port+1%}

但当我运行playbook时,端口仍然替换为4000。如何执行此任务或是否有其他方法执行此任务?

命令
{%set…%}
仅在模板的上下文中设置变量。它对任务的后续迭代没有影响。由于您正在使用
和_sequence
进行迭代,因此只需将循环变量添加到
端口
,如下所示:

<parameter name="localMemberPort">{{ port|int + item|int }}</parameter>
{{port | int+item | int}
例如,以下剧本:

- hosts: localhost
  gather_facts: false
  vars:
    node: 4
    port: 4000
  tasks:
    - debug:
        msg: >-
          <parameter name="localMemberPort">{{ port|int + item|int }}</parameter>
      with_sequence: start=0 end={{ node }}
-hosts:localhost
收集事实:错误
变量:
节点:4
港口:4000
任务:
-调试:
味精:>-
{{port | int+item | int}}
使用_序列:start=0 end={{node}
作为输出生成:

TASK [debug] *************************************************************************
ok: [localhost] => (item=0) => {
    "msg": "<parameter name=\"localMemberPort\">4000</parameter>"
}
ok: [localhost] => (item=1) => {
    "msg": "<parameter name=\"localMemberPort\">4001</parameter>"
}
ok: [localhost] => (item=2) => {
    "msg": "<parameter name=\"localMemberPort\">4002</parameter>"
}
ok: [localhost] => (item=3) => {
    "msg": "<parameter name=\"localMemberPort\">4003</parameter>"
}
ok: [localhost] => (item=4) => {
    "msg": "<parameter name=\"localMemberPort\">4004</parameter>"
}

任务[调试]*************************************************************************
确定:[localhost]=>(项=0)=>{
“msg”:“4000”
}
确定:[localhost]=>(项=1)=>{
“msg”:“4001”
}
确定:[localhost]=>(项=2)=>{
“msg”:“4002”
}
确定:[localhost]=>(项=3)=>{
“msg”:“4003”
}
确定:[localhost]=>(项=4)=>{
“msg”:“4004”
}


顺便说一句,我希望您没有在
roles/myrole/vars/main.yml
中实际设置
item
:这是默认的循环变量名,尝试在vars文件中这样设置它只会引起混乱。

{%set…%}
命令仅在模板的上下文中设置变量。它对任务的后续迭代没有影响。由于您正在使用
和_sequence
进行迭代,因此只需将循环变量添加到
端口
,如下所示:

<parameter name="localMemberPort">{{ port|int + item|int }}</parameter>
{{port | int+item | int}
例如,以下剧本:

- hosts: localhost
  gather_facts: false
  vars:
    node: 4
    port: 4000
  tasks:
    - debug:
        msg: >-
          <parameter name="localMemberPort">{{ port|int + item|int }}</parameter>
      with_sequence: start=0 end={{ node }}
-hosts:localhost
收集事实:错误
变量:
节点:4
港口:4000
任务:
-调试:
味精:>-
{{port | int+item | int}}
使用_序列:start=0 end={{node}
作为输出生成:

TASK [debug] *************************************************************************
ok: [localhost] => (item=0) => {
    "msg": "<parameter name=\"localMemberPort\">4000</parameter>"
}
ok: [localhost] => (item=1) => {
    "msg": "<parameter name=\"localMemberPort\">4001</parameter>"
}
ok: [localhost] => (item=2) => {
    "msg": "<parameter name=\"localMemberPort\">4002</parameter>"
}
ok: [localhost] => (item=3) => {
    "msg": "<parameter name=\"localMemberPort\">4003</parameter>"
}
ok: [localhost] => (item=4) => {
    "msg": "<parameter name=\"localMemberPort\">4004</parameter>"
}

任务[调试]*************************************************************************
确定:[localhost]=>(项=0)=>{
“msg”:“4000”
}
确定:[localhost]=>(项=1)=>{
“msg”:“4001”
}
确定:[localhost]=>(项=2)=>{
“msg”:“4002”
}
确定:[localhost]=>(项=3)=>{
“msg”:“4003”
}
确定:[localhost]=>(项=4)=>{
“msg”:“4004”
}


顺便说一句,我希望您没有在
roles/myrole/vars/main.yml
中实际设置
item
:这是默认的循环变量名,尝试在vars文件中这样设置它只会引起混乱。

更改
roles/myrole/vars/main.yml
,如下所示

port: 4000
node: 4
您不需要指定项,因为项是当前序列号

如果你愿意,你可以在你的任务中写一个直接计数

- name: Change axis2 configs
  template:
    src: ~/myproject/roles/myrole/templates/axis2.xml.j2
    dest: ~/myproject/{{ item }}/sever/axis2/axis2.xml
  with_sequence: count={{ node }}
只需将axis2模板更改为

<parameter name="localMemberPort">{{ port|int + item|int }}</parameter>
{{port | int+item | int}
为此,不需要在逻辑中设置变量


希望这有帮助。

如下更改您的
角色/myrole/vars/main.yml

port: 4000
node: 4
您不需要指定项,因为项是当前序列号

如果你愿意,你可以在你的任务中写一个直接计数

- name: Change axis2 configs
  template:
    src: ~/myproject/roles/myrole/templates/axis2.xml.j2
    dest: ~/myproject/{{ item }}/sever/axis2/axis2.xml
  with_sequence: count={{ node }}
只需将axis2模板更改为

<parameter name="localMemberPort">{{ port|int + item|int }}</parameter>
{{port | int+item | int}
为此,不需要在逻辑中设置变量


希望这能有所帮助。

如果有人有兴趣在列表中循环并使用每个列表项的索引值,我会这样做:

- 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是列表中的项:

项目=(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

如果有人有兴趣在列表中循环使用每个列表项的索引值,我会这样做:

- 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是列表中的项:

项目=(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