【问题标题】:Rendering SLS 'base:docker.manager.first' failed: Jinja variable list object has no element 0渲染 SLS 'base:docker.manager.first' 失败:Jinja 变量列表对象没有元素 0
【发布时间】:2019-07-23 20:06:01
【问题描述】:

您好,我一直在尝试使用 Salt 设置 Docker Swarm,但我有点卡住了...

申请时出现以下错误:

Data failed to compile:
              ----------
                  Rendering SLS 'base:docker.manager.first' failed: Jinja variable list object has no element 0

这是我的第一个.sls:

{% set manager_ip = salt['mine.get']('*', 'manager_ip').items()[0][1][0] %}

include:
  - docker.base

init new swarm cluster:
  cmd.run:
    - name: 'docker swarm init --advertise-addr {{ manager_ip }}'
    - require:
      - pkg: docker-ce

这是我提供 mine_functions 的 /srv/pillar/swarm.sls:

mine_functions:
  network.ip_addrs: [ens32]
  manager_token:
    - mine_function: cmd.run
    - "docker swarm join-token manager -q"
  manager_ip:
    - mine_function: network.ip_addrs
    - ens32
  worker_token:
    - mine_function: cmd.run
    - "docker swarm join-token worker -q"

运行 salt '*'pillar.items 时:

----------
mine_functions:
    ----------
    manager_ip:
        |_
          ----------
          mine_function:
              network.ip_addrs
        - ens32
    manager_token:
        |_
          ----------
          mine_function:
              cmd.run
        - docker swarm join-token manager -q
    network.ip_addrs:
        - ens32
    worker_token:
        |_
          ----------
          mine_function:
              cmd.run
        - docker swarm join-token worker -q

我该如何解决这个问题,或者是否有任何已知的方法可以使用 Salt 设置 Docker Swarm?

【问题讨论】:

  • 也许可以尝试使用{% salt.log_message(manager_ip) %} 记录manager_ip(并删除[0][1][0] 以查看它真正包含的内容。
  • @match 我按照你说的做了,得到了以下错误:[ERROR] {u'ret': {u'master.maf.cloud': [u"Rendering SLS 'base:docker. manager.first' failed: Jinja syntax error: Encountered unknown tag 'salt'.; line 1\n\n---\n{% salt.log_message(manager_ip) %} ', 'manager_ip').items()[0][1][ 0] %}\n{% set manager_ip = salt['mine.get']('', 'manager_ip').items() %}\n{% salt.log_message(manager_ip) %}\ ninclude:\n - docker.base\n[...]\n---"]}, u'out': u'highstate'} 还有其他调试方法吗?
  • 我的错 - 我的意思是 {%- do salt.log.error(manager_ip) -%}(假设您使用的是 salt >= 2017.7.0 docs.saltstack.com/en/latest/topics/jinja/index.html#logs
  • 还有其他地方可以获取我的日志吗?这(部分)打印到我的控制台(在记录 /var/log/salt/master 文件中,我得到了大量可读性不强的日志,日志中没有使用新行?):master.maf.cloud_master :gist.github.com/MaartenMol/5843d3b47892c1a25cd45d9d360267d0
  • 我认为日志受到来自docker swarm init 的错误的污染,不理解manager_ip 的修改内容。您能否将您的状态文件更改为包含{% set manager_ip = ...%}{%- do salt.log.error(manager_ip) -%} 日志记录行,并注释掉其余部分(includecmd.run 并查看日志包含的内容?跨度>

标签: docker jinja2 docker-swarm salt-stack


【解决方案1】:

更改了变量名:

旧:

{% set manager_ip = salt['mine.get']('*', 'manager_ip').items()[0][1][0] %}

include:
  - docker.base

init new swarm cluster:
  cmd.run:
    - name: 'docker swarm init --advertise-addr {{ manager_ip }}'
    - require:
      - pkg: docker-ce

新:

{% set join_ip = salt['mine.get']('*', 'manager_ip').items()[0][1][0] %}

include:
 - docker.base

init cluster:
  cmd.run:
    - name: 'docker swarm init --advertise-addr {{ join_ip }}'
    - require:
      - pkg: docker-ce

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 2018-11-18
    • 2020-10-14
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多