Stat.exists 与 ansible 中的变量列表

Posted

技术标签:

【中文标题】Stat.exists 与 ansible 中的变量列表【英文标题】:Stat.exists with list of variables in ansible 【发布时间】:2016-08-06 09:22:43 【问题描述】:

我在 Ansible 中使用字典检查现有文件时遇到问题。

  tasks:
  - name: Checking existing file id
    stat: path=/tmp/ item.id .conf
    with_items: " file_vars "
    register: check_file_id

  - name: Checking existing file name
    stat: path=/tmp/ item.name .conf
    with_items: " file_vars "
    register: check_file_name

  - name: Checking file exists
    debug: msg='File_id exists'
    when: check_file_id.stat.exists == True

  - name: Checking file name exists
    debug: msg='File name exists'
    when: check_file_name.stat.exists == True

  vars:
    file_vars:
      -  id: 1, name: one 
      -  id: 2, name: two 

然后,如果我尝试运行 playbook,则会收到错误消息:

FAILED! => "failed": true, "msg": "The conditional check 'check_file_id.stat.exists == True' failed. The error was: error while evaluating conditional (check_file_id.stat.exists == True): 'dict' object has no attribute 'stat'\n\n

我试过调试它:

- debug: var=check_file_id 并得到:

"results": [
    
        "_ansible_item_result": true, 
        "_ansible_no_log": false, 
        "changed": false, 
        "invocation": 
            "module_args": 
                "checksum_algorithm": "sha1", 
                "follow": false, 
                "get_checksum": true, 
                "get_md5": true, 
                "mime": false, 
                "path": "/tmp/1.conf"
            , 
            "module_name": "stat"
        , 
        "item": 
            "id": 1, 
            "name": "one"
        , 
        "stat": 
            "exists": false
        
    , 
    
        "_ansible_item_result": true, 
        "_ansible_no_log": false, 
        "changed": false, 
        "invocation": 
            "module_args": 
                "checksum_algorithm": "sha1", 
                "follow": false, 
                "get_checksum": true, 
                "get_md5": true, 
                "mime": false, 
                "path": "/tmp/2.conf"
            , 
            "module_name": "stat"
        , 
        "item": 
            "id": 2, 
            "name": "two"
        , 
        "stat": 
            "exists": false
        
    
]

我哪里错了? 是否可以将stat.exists 与变量列表一起使用?

感谢您的回答!

【问题讨论】:

【参考方案1】:

问题是您在循环中注册check_file_id。您需要阅读the documentation on using register in a loop,其中讨论了这样做的含义。您的变量有一个 results 键,其中包含循环每次迭代的结果。您可以在 debug 输出中看到这一点。

在后续任务中,您应该迭代 check_file_id.results 而不是 file_vars,如下所示:

- hosts: localhost
  gather_facts: false
  vars:
    file_vars:
      - id: 1, name: foo
      - id: 2, name: bar
  tasks:
    - name: Checking existing file id
      stat:
        path: ./files/ item.id .conf
      with_items: " file_vars "
      register: check_file_id

    - name: Checking existing file name
      stat:
        path: ./files/ item.name .conf
      with_items: " file_vars "
      register: check_file_name

    - debug:
        msg: 'file id item.item.id (name item.item.name) exists'
      with_items: " check_file_id.results "
      when: item.stat.exists

    - debug:
        msg: 'file name item.item.name (id item.item.id) exists'
      with_items: " check_file_name.results "
      when: item.stat.exists

【讨论】:

以上是关于Stat.exists 与 ansible 中的变量列表的主要内容,如果未能解决你的问题,请参考以下文章

跨端开发浪潮中的变与不变

Ansible-playbook 同一组相同主机

自动化运维工具-Ansible Jinja2模板

如何更新数据流 ssis 中的变量值?

通过查看Windbg中的变量值去定位C++软件异常问题

ansible内置主机变量与魔法变量