首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我迭代由jinja2生成的字符串列表时,我会得到一系列字符,而不是字符串。为什么会发生这种事?

当我迭代由jinja2生成的字符串列表时,我会得到一系列字符,而不是字符串。为什么会发生这种事?
EN

Stack Overflow用户
提问于 2021-04-02 06:25:24
回答 1查看 47关注 0票数 0

我一直在尝试通过ansible部署ceph集群。当我试图将我的deploy_ceph_cluster.sh.j2呈现为一个shell脚本时,我遇到了一些问题。为了更好地说明,我将提供一个最低限度的工作示例。

这是我的库存文件:

代码语言:javascript
复制
# inventory
[local]
localhost ansible_host=127.0.0.1 ansible_connection=local

[ceph_osd]
node1 ansible_host=192.168.1.2 rules="{'rule1': {'bcache': 'none', 'disks': '["/dev/sda", "/dev/sdc", "/dev/sdd", "/dev/sde"]'}}"
node2 ansible_host=192.168.1.3 rules="{'rule1': {'bcache': 'none', 'disks': '["/dev/sda", "/dev/sdc", "/dev/sdd", "/dev/sde"]'}}"
node3 ansible_host=192.168.1.4 rules="{'rule1': {'bcache': 'none', 'disks': '["/dev/sda", "/dev/sdc", "/dev/sdd", "/dev/sde"]'}}"

我的jinja2模板文件:

代码语言:javascript
复制
#!/bin/sh

createOSD() {
{% for host in groups['ceph_osd'] %}
{% for rule in hostvars[host].rules.values() %}
{% if rule.bcache != 'none' %}
    ssh {{ host }} make-bcache -B {{ rule.disks | join(' ') }} -C {{ rule.bcache }} --wipe-bcache
    bcache_name=$(lsblk -o KNAME {{ rule.bcache }} | grep bcache)
    ssh {{ host }} echo writeback > /sys/block/$bcache_name/bcache/cache_mode
    ceph-deploy osd create --data /dev/$bcache_name {{ host }}
{% else %}
echo {{rule.disks}}
{% for disk in rule.disks %}
    ceph-deploy osd create --data {{ disk }} {{ host }}
{% endfor %}
{% endif %}
{% endfor %}
{% endfor %}
}

createOSD

最后,我的deploy.yml在下面:

代码语言:javascript
复制
# deploy.yml file
---
- hosts: 127.0.0.1
  connection: local
  gather_facts: False
  name: render jinja2 template
  tasks:
  - name: render all template_out template files in local
    template: src=./deploy_ceph_cluster.sh.j2 dest=deploy_ceph_cluster.sh
...

您可以使用以下命令来呈现我的模板文件:

代码语言:javascript
复制
$ ansible-playbook deploy.yml -i inventory 

PLAY [render jinja2 template] **************************************************

TASK [render all template_out template files in local] *************************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

到目前一切尚好。但是deploy_ceph_cluster.sh的上下文是错误的。其背景如下:

代码语言:javascript
复制
#!/bin/sh

createOSD() {
echo [/dev/sda, /dev/sdc, /dev/sdd, /dev/sde]
    ceph-deploy osd create --data [ node1
    ceph-deploy osd create --data / node1
    ceph-deploy osd create --data d node1
    ceph-deploy osd create --data e node1
    ceph-deploy osd create --data v node1
    ceph-deploy osd create --data / node1
    ceph-deploy osd create --data s node1
    ceph-deploy osd create --data d node1
    ceph-deploy osd create --data a node1
    ceph-deploy osd create --data , node1
    ceph-deploy osd create --data   node1
    ceph-deploy osd create --data / node1
    ceph-deploy osd create --data d node1
    ceph-deploy osd create --data e node1
    ceph-deploy osd create --data v node1
    ceph-deploy osd create --data / node1
    ceph-deploy osd create --data s node1
    ceph-deploy osd create --data d node1
    ceph-deploy osd create --data c node1
    ceph-deploy osd create --data , node1
    ceph-deploy osd create --data   node1
    ceph-deploy osd create --data / node1
    ceph-deploy osd create --data d node1
    ceph-deploy osd create --data e node1
    ceph-deploy osd create --data v node1
    ceph-deploy osd create --data / node1
    ceph-deploy osd create --data s node1
    ceph-deploy osd create --data d node1
    ceph-deploy osd create --data d node1
    ceph-deploy osd create --data , node1
    ceph-deploy osd create --data   node1
    ceph-deploy osd create --data / node1
    ceph-deploy osd create --data d node1
    ceph-deploy osd create --data e node1
    ceph-deploy osd create --data v node1
    ceph-deploy osd create --data / node1
    ceph-deploy osd create --data s node1
    ceph-deploy osd create --data d node1
    ceph-deploy osd create --data e node1
    ceph-deploy osd create --data ] node1
echo [/dev/sda, /dev/sdc, /dev/sdd, /dev/sde]
    ceph-deploy osd create --data [ node2
    ceph-deploy osd create --data / node2
    ceph-deploy osd create --data d node2
    ceph-deploy osd create --data e node2
    ceph-deploy osd create --data v node2
    ceph-deploy osd create --data / node2
    ceph-deploy osd create --data s node2
    ceph-deploy osd create --data d node2
    ceph-deploy osd create --data a node2
    ceph-deploy osd create --data , node2
    ceph-deploy osd create --data   node2
    ceph-deploy osd create --data / node2
    ceph-deploy osd create --data d node2
    ceph-deploy osd create --data e node2
    ceph-deploy osd create --data v node2
    ceph-deploy osd create --data / node2
    ceph-deploy osd create --data s node2
    ceph-deploy osd create --data d node2
    ceph-deploy osd create --data c node2
    ceph-deploy osd create --data , node2
    ceph-deploy osd create --data   node2
    ceph-deploy osd create --data / node2
    ceph-deploy osd create --data d node2
    ceph-deploy osd create --data e node2
    ceph-deploy osd create --data v node2
    ceph-deploy osd create --data / node2
    ceph-deploy osd create --data s node2
    ceph-deploy osd create --data d node2
    ceph-deploy osd create --data d node2
    ceph-deploy osd create --data , node2
    ceph-deploy osd create --data   node2
    ceph-deploy osd create --data / node2
    ceph-deploy osd create --data d node2
    ceph-deploy osd create --data e node2
    ceph-deploy osd create --data v node2
    ceph-deploy osd create --data / node2
    ceph-deploy osd create --data s node2
    ceph-deploy osd create --data d node2
    ceph-deploy osd create --data e node2
    ceph-deploy osd create --data ] node2
echo [/dev/sda, /dev/sdc, /dev/sdd, /dev/sde]
    ceph-deploy osd create --data [ node3
    ceph-deploy osd create --data / node3
    ceph-deploy osd create --data d node3
    ceph-deploy osd create --data e node3
    ceph-deploy osd create --data v node3
    ceph-deploy osd create --data / node3
    ceph-deploy osd create --data s node3
    ceph-deploy osd create --data d node3
    ceph-deploy osd create --data a node3
    ceph-deploy osd create --data , node3
    ceph-deploy osd create --data   node3
    ceph-deploy osd create --data / node3
    ceph-deploy osd create --data d node3
    ceph-deploy osd create --data e node3
    ceph-deploy osd create --data v node3
    ceph-deploy osd create --data / node3
    ceph-deploy osd create --data s node3
    ceph-deploy osd create --data d node3
    ceph-deploy osd create --data c node3
    ceph-deploy osd create --data , node3
    ceph-deploy osd create --data   node3
    ceph-deploy osd create --data / node3
    ceph-deploy osd create --data d node3
    ceph-deploy osd create --data e node3
    ceph-deploy osd create --data v node3
    ceph-deploy osd create --data / node3
    ceph-deploy osd create --data s node3
    ceph-deploy osd create --data d node3
    ceph-deploy osd create --data d node3
    ceph-deploy osd create --data , node3
    ceph-deploy osd create --data   node3
    ceph-deploy osd create --data / node3
    ceph-deploy osd create --data d node3
    ceph-deploy osd create --data e node3
    ceph-deploy osd create --data v node3
    ceph-deploy osd create --data / node3
    ceph-deploy osd create --data s node3
    ceph-deploy osd create --data d node3
    ceph-deploy osd create --data e node3
    ceph-deploy osd create --data ] node3
}

createOSD

如您所见,每个磁盘变量都类似于[/dev/sda, /dev/sdc, /dev/sdd, /dev/sde],但在下面的代码中,它被拆分为字符,例如,/dev/sda被拆分为'/‘、'd’、'e‘、'v’balabala.

代码语言:javascript
复制
createOSD() {
{% for host in groups['ceph_osd'] %}
{% for rule in hostvars[host].rules.values() %}
...  omit some irrelevant code
{% for disk in rule.disks %}
    ceph-deploy osd create --data {{ disk }} {{ host }}
{% endfor %}
{% endfor %}
{% endfor %}
}

我有什么问题吗?有人能给我一些提示或建议吗?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-02 06:51:51

{.,“磁盘”:“/dev/sda”、"/dev/sdc“、"/dev/sdd”、“/dev/sde”}

'disks'的值以引号表示,因此实际上它是str而不是list。您需要删除外部引号:

代码语言:javascript
复制
{..., 'disks': ['/dev/sda', '/dev/sdc', '/dev/sdd', '/dev/sde']}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66915254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档