【问题标题】:Set of environment for next using in Ansible playbook下一步在 Ansible playbook 中使用的环境集
【发布时间】:2021-12-24 03:24:47
【问题描述】:

我有一个包含一些配置的文件:

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 $6}' |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 $6}' |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 中使用它

能否请您给我一些建议...谢谢!

【问题讨论】:

    标签: ansible environment-variables jitsi


    【解决方案1】:

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

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

    您得到的确切错误是因为没有.stdout 内容,因此"{{ siguiente_shard.stdout }}" 解析为"",但是(无论好坏)debug:var: 实际上实现为如果你写了msg: "{{ var }}",那么这个sn-p:

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

    其实就是这个sn-p

        - debug:
            msg: "{{ }}"
    

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

    解决方法是删除 jinja2 小胡子,或将 var: 更改为 msg:


    然后是与此相关的错误,是因为您在 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 $6}' |uniq | sort | tail -n1 | cut -d '-' -f2 | xargs printf "%d" )
          register: siguiente_shard
    

    ...撇开在 ansible 中使用这样一个怪物 shell 管道确实不是 ansible 思考世界的方式,而且您拥有的“动态”分片碰撞逻辑会使您的剧本的幂等性处于危险之中

    【讨论】:

    • 谢谢,我试过得到输出:ok: [jitsi] => { "siguiente_shard.stdout": "3" } 我如何使用这个输出在我的配置文件中插入数字? org.jitsi.videobridge.xmpp.user.shard-{siguiente_shard}.HOSTNAME=localhost org.jitsi.videobridge.xmpp.user.shard-{siguiente_shard}.DOMAIN=auth.js.name.com org.jitsi.videobridge.xmpp.user.shard-{siguiente_shard}.USERNAME=rrr org.jitsi.videobridge.xmpp.user.shard-{siguiente_shard}.PASSWORD=ENrewqsd etc...
    • 这听起来像是一个不同的问题,并且 cmets 不能替代完全形成的问题。既然你说这个答案解决了你的问题,请“接受”它,然后随时提出一个关于lineinfile: 工作原理的新问题
    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 2019-04-24
    • 2022-01-11
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多