Ansible playbook设置Jitsi分片环境变量报错如何解决
问题原因
- 第一个shell任务仅在当前shell会话里赋值了变量,没有将结果输出到标准输出,导致注册的
siguiente_shard.stdout为空,debug时引用空值触发模板解析错误 - debug模块的
var参数不需要加{{ }}包裹,直接写变量名即可 - 传递环境变量时没有用
{{ }}包裹Ansible变量,导致传递的是字符串siguiente_shard.stdout而不是实际变量值 - 重复使用
siguiente_shard作为注册变量名,会覆盖之前的结果,容易出现逻辑混乱
正确实现方案
先正确获取下一个分片序号,再通过set_fact将其设置为Ansible全局事实,方便后续任务、角色调用,修正后的playbook如下:
--- - hosts: jitsi become: true tasks: - name: 获取下一个分片序号 shell: > expr 1 + $(grep 'shard-' /etc/jitsi/videobridge/sip-communicator.properties | awk -F '.' '{print $6}' | uniq | sort | tail -n1 | cut -d '-' -f2 | xargs printf "%d" ) register: shard_calculate_result - name: 将分片序号设置为全局可调用的事实 set_fact: siguiente_shard: "{{ shard_calculate_result.stdout | int }}" - debug: var: siguiente_shard # 若需要给shell任务传递环境变量,写法参考如下 - name: 测试环境变量传递 shell: echo $SIGUIENTE_SHARD environment: SIGUIENTE_SHARD: "{{ siguiente_shard }}" register: env_test_result - debug: var: env_test_result.stdout
角色内使用说明
/roles/Jitsi/vars/main.yaml中的变量是角色加载时就解析的静态变量,不能直接引用运行时生成的set_fact变量,可通过两种方式实现调用:
- 方式1:调用角色时通过vars参数传递变量
后续在角色内部直接使用roles: - role: Jitsi vars: jitsi_current_shard: "{{ siguiente_shard }}"jitsi_current_shard即可 - 方式2:在角色的
defaults/main.yaml中定义默认占位变量,运行时会被全局的siguiente_shard变量自动覆盖(Ansible变量优先级中,play级别的事实优先级高于角色defaults、vars)
内容的提问来源于stack exchange,提问作者Oleg
相关产品推荐
相关产品推荐

