Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops ansible嵌套循环文件带\u嵌套的全局ansible字典_Loops_Dictionary_Ansible_Jinja2 - Fatal编程技术网

Loops ansible嵌套循环文件带\u嵌套的全局ansible字典

Loops ansible嵌套循环文件带\u嵌套的全局ansible字典,loops,dictionary,ansible,jinja2,Loops,Dictionary,Ansible,Jinja2,假设我有以下树: foo/ ├─ bar/ │ ├─ secret/ │ │ ├─ directory_1/ │ │ │ ├─ file1 │ │ │ ├─ file2 │ │ ├─ directory_2/ │ │ │ ├─ file3 │ │ │ ├─ file4 我不知道这些文件是什么,在目录1和目录2中有多少文件,我希望能够在其中循环并列出它们 我有以下解释: my_directory_list: var1: secret_dir file:

假设我有以下树:

foo/
├─ bar/
│  ├─ secret/
│  │  ├─ directory_1/
│  │  │  ├─ file1
│  │  │  ├─ file2
│  │  ├─ directory_2/
│  │  │  ├─ file3
│  │  │  ├─ file4
我不知道这些文件是什么,在目录1目录2中有多少文件,我希望能够在其中循环并列出它们

我有以下解释:

my_directory_list:
  var1: secret_dir
  file:
    - directory: directory_1
      secret_name: secret_1
    - directory: directory_2
      secret_name: secret_2
以及以下任务:

- name: "my task"
  shell: echo ' in my directory : {{item.0.directory}} i have {{item.1}} '
  with_nested:
    - "{{my_root_directory.file}}"
    - "{{ lookup('fileglob', '/foo/bar/secret/{{item.0.directory}}') }}"
预计产量为:

in my directory directory_1 i have file1
in my directory directory_1 i have file2
in my directory directory_2 i have file3
in my directory directory_2 i have file4
但是我不能让它工作,因为列表是空的,我试着:

- "{{ lookup('fileglob', '/foo/bar/secret/{{item.0.directory}}').split(',') }}"
但列表还是空的,我做错了什么?是否可以仅使用ansible实现这种输出?没有金贾/蟒蛇


感谢您的帮助,

首先,您的playbook中存在一些语法错误,这些错误将阻止它运行

引用错误 如果在YAML值中使用引号,则必须引用整个值。所以当你写作时:

- name: "my task"
  shell: echo ' in my directory : {{item.0.directory}} i have {{item.1}} '
- "{{ lookup('fileglob', '/foo/bar/secret/{{item.0.directory}}') }}"
shell:
键的该值将导致错误:

ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:
JSON: Expecting value: line 1 column 1 (char 0)

Syntax Error while loading YAML.
  mapping values are not allowed in this context
您需要将整个值放在引号中,如下所示:

- name: "my task"
  shell: "echo ' in my directory : {{item.0.directory}} i have {{item.1}} '"
- name: "my task"
  shell: >-
    echo ' in my directory : {{item.0.directory}} i have {{item.1}} '
- "{{ lookup('fileglob', '/foo/bar/secret/' ~ item.0.directory) }}"
我更喜欢使用YAML的块报价操作符之一,如下所示:

- name: "my task"
  shell: "echo ' in my directory : {{item.0.directory}} i have {{item.1}} '"
- name: "my task"
  shell: >-
    echo ' in my directory : {{item.0.directory}} i have {{item.1}} '
- "{{ lookup('fileglob', '/foo/bar/secret/' ~ item.0.directory) }}"
这避免了在需要使用时必须玩引号转义游戏 命令行中的双引号和单引号

变量替换错误 您从不嵌套Jinja模板标记(
{{…}}
)。当你写作时:

- name: "my task"
  shell: echo ' in my directory : {{item.0.directory}} i have {{item.1}} '
- "{{ lookup('fileglob', '/foo/bar/secret/{{item.0.directory}}') }}"
最后将文本字符串
/foo/bar/secret/{{item.0.directory}}
传递给
fileglob
查找。相反,您需要这样写:

- name: "my task"
  shell: "echo ' in my directory : {{item.0.directory}} i have {{item.1}} '"
- name: "my task"
  shell: >-
    echo ' in my directory : {{item.0.directory}} i have {{item.1}} '
- "{{ lookup('fileglob', '/foo/bar/secret/' ~ item.0.directory) }}"
其中,
~
是Jinja字符串连接运算符。但这还是 不起作用,因为

逻辑错误 循环变量
在的参数中不可用
带有嵌套的_
(因为当 参数),因此即使修复了语法,也会 请参阅以下故障:

TASK [my task] *******************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "'item' is undefined"}

我会把任务分成两部分来解决这个问题 任务:一个查找文件,另一个操作数据 (或显示它)。比如:

- hosts: localhost
  gather_facts: false
  vars:
    my_directory_list:
      var1: secret_dir
      file:
        - directory: directory_1
          secret_name: secret_1
        - directory: directory_2
          secret_name: secret_2

  tasks:
    - name: "find files"
      find:
        path: "foo/bar/secret/{{ item.directory }}"
      register: files
      loop: "{{ my_directory_list.file }}"

    - name: "display results"
      debug:
        msg: "In my directory {{ item.0.item.directory }} I have {{ item.1.path|basename }}"
      loop: "{{ files.results|subelements('files') }}"
      loop_control:
        label: "{{ item.1.path }}"
在上面的剧本中,“查找文件”任务使用
find
模块 获取中列出的每个目录中的文件列表
我的目录列表。文件
。我们将这个循环的结果注册到 变量
文件
。请参阅以了解该变量的结构

在“显示结果”任务中,我们迭代第一个 使用过滤器循环。这实际上给了我们一个机会 展平
(目录、文件路径)
元组列表,以便生成 您正在寻找的输出

对于示例文件结构,运行上述playbook将生成以下输出:


PLAY [localhost] *****************************************************************************************************************************************************************************

TASK [find files] ****************************************************************************************************************************************************************************
ok: [localhost] => (item={'directory': 'directory_1', 'secret_name': 'secret_1'})
ok: [localhost] => (item={'directory': 'directory_2', 'secret_name': 'secret_2'})

TASK [display results] ***********************************************************************************************************************************************************************
ok: [localhost] => (item=foo/bar/secret/directory_1/file2) => {
    "msg": "In my directory directory_1 I have file2"
}
ok: [localhost] => (item=foo/bar/secret/directory_1/file1) => {
    "msg": "In my directory directory_1 I have file1"
}
ok: [localhost] => (item=foo/bar/secret/directory_2/file4) => {
    "msg": "In my directory directory_2 I have file4"
}
ok: [localhost] => (item=foo/bar/secret/directory_2/file3) => {
    "msg": "In my directory directory_2 I have file3"
}

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


谢谢你的回答,我需要对文件夹中的文件运行一些kubectl机密,但我想我明白你的逻辑,是的,你对逻辑问题的看法是正确的,我也这么想。。检查一下,我一到家就会回来的,泰