如何求Jinja2 ansible中两个定义变量的和
我有04个服务器包。这些文件在循环中下载和提取。我想把端口号改为4000400140024003和40004 我在如何求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
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