Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/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
List Ansible:唯一最短路径 上下文_List_Filter_Ansible_Jinja2 - Fatal编程技术网

List Ansible:唯一最短路径 上下文

List Ansible:唯一最短路径 上下文,list,filter,ansible,jinja2,List,Filter,Ansible,Jinja2,我有一个要删除的文件和目录列表。 这是从rsync标准输出中以单词“deleting”开头的行中获得的 rsync stdout_lines: [ "building file list ... done", "*deleting Lab02/Ex2/Doc1.txt", "*deleting Lab02/Ex2/", "*deleting Lab02/Ex1/Doc1.txt&qu

我有一个要删除的文件和目录列表。
这是从rsync标准输出中以单词“deleting”开头的行中获得的

rsync stdout_lines: [
    "building file list ... done",
    "*deleting   Lab02/Ex2/Doc1.txt",
    "*deleting   Lab02/Ex2/",
    "*deleting   Lab02/Ex1/Doc1.txt",
    "*deleting   Lab02/Ex1/",
    "*deleting   Lab02/",
    ".d..t...... ./",
    "*deleting   Lab01/Ex2/Doc1.txt",
    "*deleting   Lab01/Ex2/",
    "*deleting   Lab01/Ex1/Doc2.txt",
    "*deleting   Lab01/Ex1/Doc1.txt",
    ".d..t...... Lab01/",
    ".d..t...... Lab01/Ex1/",
    "sent 350 bytes  received 191 bytes  360.67 bytes/sec",
    "total size is 614  speedup is 1.13 (DRY RUN)"
]  
格式使用:

'{{ sync_return.stdout_lines | select("regex", "^[*]deleting") | map("regex_replace", "^[*]deleting", "") | map("regex_replace", " ", "") | list }}'
此列表格式的基本示例如下所示:

formatted list: [
    "Lab02/Ex2/Doc1.txt",
    "Lab02/Ex2/",
    "Lab02/Ex1/Doc1.txt",
    "Lab02/Ex1/",
    "Lab02/",
    "Lab01/Ex2/Doc1.txt",
    "Lab01/Ex2/",
    "Lab01/Ex1/Doc2.txt",
    "Lab01/Ex1/Doc1.txt"
]
为了加快删除过程(通过减少要迭代的元素数量),我将列表分为两个子列表:

  • 目录列表。(主列表中以“/”结尾的元素)

    “{items_to_delete | select(“regex”,“/$”)| list}”

  • 文件路径的列表。(包含目录的元素不会被删除)

    “{items_to_delete |拒绝(“匹配”,item)|列表}”

上述示例的子列表将是

directories to delete: [
    "Lab02/Ex2/",
    "Lab02/Ex1/",
    "Lab02/",
    "Lab01/Ex2/"
]

files to delete: [
    "Lab01/Ex1/Doc2.txt",
    "Lab01/Ex1/Doc1.txt"
]
问题 虽然当前的解决方案可行,但它并不是最好的解决方案。我们的梦想是有一个解决方案,“要删除的目录”列表只包含可能的最高级别目录。i、 e.由于我们知道目录“Lab02/”正在被删除,“要删除的目录”将不包含“Lab02/Ex2/”或“Lab02/Ex1/”
我相信我的目标与os.path.commonprefix python函数有些相似,但是必须为列表中的各种文件路径执行此操作


我对Ansible还比较陌生,因此非常感谢您在这方面提供的任何指导/帮助。

我不会问您为什么要实施这一点,我将把它作为一种练习

其思想是,您可以按字母顺序对目录进行排序,然后在循环路径的同时,删除以前一行开头的任何一个路径

您可以这样编写过滤器(放入
filter\u plugins
目录):

然后:

使用以下工具进行本地测试:

---
 
- hosts: localhost
  tasks:
    - name: Test data
      set_fact: 
        foo:
          - 'Lab01/'
          - 'Lab01/Ex5/'
          - 'Ex2/foo3/'
          - 'Ex2/foo2/'
          - 'Ex2/'
          - 'Lab03/Ex5/e/'
          - 'Lab02/y/z/Lab01/1/'
          - 'Lab02/y/z/Lab01/3/'
          - 'Lab01/Ex5/Lab02/'
          - 'Lab03/Ex5/d/1'

    - name: Filter
      set_fact: 
        bar: "{{ foo | common_paths }}"
输出:

$ ansible-playbook common_paths.yml  -vvv
ansible-playbook 2.10.4

PLAYBOOK: common_paths.yml *********************************************************************************
1 plays in common_paths.yml

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

TASK [Gathering Facts] *********************************************************************************
ok: [localhost]

TASK [Test data] *********************************************************************************    task path: /home/guido/Development/git/ansible-local/common_paths.yml:5
ok: [localhost] => {
    "ansible_facts": {
        "foo": [
            "Lab01/",
            "Lab01/Ex5/",
            "Ex2/foo3/",
            "Ex2/foo2/",
            "Ex2/",
            "Lab03/Ex5/e/",
            "Lab02/y/z/Lab01/1/",
            "Lab02/y/z/Lab01/3/",
            "Lab01/Ex5/Lab02/",
            "Lab03/Ex5/d/1/"
        ]
    },
    "changed": false
}

TASK [Filter] *********************************************************************************
task path: /home/guido/Development/git/ansible-local/common_paths.yml:19
ok: [localhost] => {
    "ansible_facts": {
        "bar": [
            "Ex2/",
            "Lab01/",
            "Lab02/y/z/Lab01/1/",
            "Lab02/y/z/Lab01/3/",
            "Lab03/Ex5/d/1/",
            "Lab03/Ex5/e/"
        ]
    },
    "changed": false
}

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

我想知道如果你为插件添加一个完整的可运行代码,那么它会更有帮助。(还是很好)@P。。。。很好的一点,会很完美,真的很感激-谢谢@圭多
---
 
- hosts: localhost
  tasks:
    - name: Test data
      set_fact: 
        foo:
          - 'Lab01/'
          - 'Lab01/Ex5/'
          - 'Ex2/foo3/'
          - 'Ex2/foo2/'
          - 'Ex2/'
          - 'Lab03/Ex5/e/'
          - 'Lab02/y/z/Lab01/1/'
          - 'Lab02/y/z/Lab01/3/'
          - 'Lab01/Ex5/Lab02/'
          - 'Lab03/Ex5/d/1'

    - name: Filter
      set_fact: 
        bar: "{{ foo | common_paths }}"
$ ansible-playbook common_paths.yml  -vvv
ansible-playbook 2.10.4

PLAYBOOK: common_paths.yml *********************************************************************************
1 plays in common_paths.yml

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

TASK [Gathering Facts] *********************************************************************************
ok: [localhost]

TASK [Test data] *********************************************************************************    task path: /home/guido/Development/git/ansible-local/common_paths.yml:5
ok: [localhost] => {
    "ansible_facts": {
        "foo": [
            "Lab01/",
            "Lab01/Ex5/",
            "Ex2/foo3/",
            "Ex2/foo2/",
            "Ex2/",
            "Lab03/Ex5/e/",
            "Lab02/y/z/Lab01/1/",
            "Lab02/y/z/Lab01/3/",
            "Lab01/Ex5/Lab02/",
            "Lab03/Ex5/d/1/"
        ]
    },
    "changed": false
}

TASK [Filter] *********************************************************************************
task path: /home/guido/Development/git/ansible-local/common_paths.yml:19
ok: [localhost] => {
    "ansible_facts": {
        "bar": [
            "Ex2/",
            "Lab01/",
            "Lab02/y/z/Lab01/1/",
            "Lab02/y/z/Lab01/3/",
            "Lab03/Ex5/d/1/",
            "Lab03/Ex5/e/"
        ]
    },
    "changed": false
}

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