簡體   English   中英

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 $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: {{}}"}

我如何在劇本中設置環境siguiente_shard以便將來在文件/roles/Jitsi/vars/main.yaml使用它

你能幫我提供建議嗎...謝謝!

這是因為你有一個錯誤和一個錯誤的模塊使用; 我們將從錯誤的模塊使用開始,因為這是您的具體問題:

var:用於——顧名思義——變量名或表達式。 如果您想做自己的 jinja2 表達式,那么msg:更接近您要查找的內容

您得到的確切錯誤是因為沒有.stdout內容,因此"{{ siguiente_shard.stdout }}"解析為"" ,但是(無論好壞) var: of debug:實際上是實現的你寫了msg: "{{ var }}"所以這個片段:

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

實際上是這個片段

    - debug:
        msg: "{{ }}"

這是非法的 jinja2,因此是您的錯誤消息。

修復方法是刪除 jinja2 胡子,或將var:更改為msg:


然后,與此相關的 bug 是因為您在shell:分配了一個shell變量,這是在 shell 中做的非常好的和合法的事情 - 但它不發出output 因此, 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 思考世界的方式,而且你擁有的“動態”碎片碰撞邏輯使你的劇本的冪等性處於危險之中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM