Ansible playbook 下一次使用的环境集

Set of environment for next using in Ansible playbook

我有一个配置文件:

org.jitsi.videobridge.xmpp.user.shard-2.HOSTNAME=localhost
org.jitsi.videobridge.xmpp.user.shard-2.DOMAIN=auth.js.name.com
org.jitsi.videobridge.xmpp.user.shard-2.USERNAME=rrr
org.jitsi.videobridge.xmpp.user.shard-2.PASSWORD=ENrewqsd
org.jitsi.videobridge.xmpp.user.shard-2.MUC_JIDS=JvbBrewery@internal.auth.js.name.com
org.jitsi.videobridge.xmpp.user.shard-2.MUC_NICKNAME=28bjrkd046-5891-bc2a-c6426a58966r4

在我的下一本剧本中,我想使用 env。 {siguiente_shard} 更改分片服务器的数量(shard-3、shard-4 等)为此我有一些 shell 命令:

siguiente_shard=$(expr 1 + $(grep 'shard-' /etc/jitsi/videobridge/sip-communicator.properties | awk -F '.' '{print }' |uniq | sort | tail -n1 | cut -d '-' -f2 | xargs printf "%d" ))

我有一本剧本:

---
- hosts: jitsi
  become: true
  tasks:

    - name: Next number of shard script
      shell: siguiente_shard=$(expr 1 + $(grep 'shard-' /etc/jitsi/videobridge/sip-communicator.properties | awk -F '.' '{print }' |uniq | sort | tail -n1 | cut -d '-' -f2 | xargs printf "%d" ))
      register: siguiente_shard

    - debug:
        var: "{{ siguiente_shard.stdout }}"
     
    - name: Echo my_env_var
      shell: echo $siguiente_shard
      environment:
        siguiente_shard_env: siguiente_shard.stdout
      register: siguiente_shard
    - debug:
        var: "{{ siguiente_shard.stdout }}"

但出现错误:

fatal: [jitsi]: FAILED! => {"msg": "template error while templating string: Expected an expression, got 'end of print statement'. String: {{}}"}

我如何在 playbook 中设置环境 siguiente_shard 以便将来在文件 /roles/Jitsi/vars/main.yaml

中使用它

你能帮我出出主意吗...谢谢!

是因为你有一个bug,一个错误的模块使用;我们将从错误的模块使用开始,因为这是您的具体问题:

var: 是——顾名思义——变量名或表达式。如果你想做你自己的 jinja2 表达式,那么 msg: 更接近你正在寻找的东西

您得到的确切错误是因为没有 .stdout 内容,因此 "{{ siguiente_shard.stdout }}" 解析为 "",但是(无论好坏)var:debug: 实际上是像你写了 msg: "{{ var }}" 一样实现的,因此这个片段:

    - debug:
        var: "{{ siguiente_shard.stdout }}"

实际上是这个片段

    - debug:
        msg: "{{ }}"

这是非法的 jinja2,因此是您的错误消息。

解决方法是移除 jinja2 胡须,或将 var: 更改为 msg:


然后就是bug,跟那个有关,是因为你在shell:里赋值了shell变量,完全没问题在 shell 中做合法的事情——但它发出 无输出 。因此,register: 按照指示执行并存储了来自 shell 操作的标准输出,但没有任何

因此,您可能想要的是:


    - name: Next number of shard script
      shell: expr 1 + $(grep 'shard-' /etc/jitsi/videobridge/sip-communicator.properties | awk -F '.' '{print }' |uniq | sort | tail -n1 | cut -d '-' -f2 | xargs printf "%d" )
      register: siguiente_shard

...抛开在 ansible 中使用这样一个怪物 shell 管道真的不是 ansible 思考世界的方式,而且你拥有的“动态”分片碰撞逻辑放置了幂等性你的剧本有风险