Ansible-在角色中有条件地包含文件

Ansible-在角色中有条件地包含文件,ansible,ansible-playbook,Ansible,Ansible Playbook,我正在尝试创建一个角色,该角色仅在注册的变量具有某个值(在本例中为文件的md5sum)时才会运行 角色/main.yml如下所示: ---- - name: Has this already been done? Check for the script, & it's md5sum command: md5sum /usr/sbin/sendmail.postfix register: md5sum ignore_errors: True - name: What's t

我正在尝试创建一个角色,该角色仅在注册的变量具有某个值(在本例中为文件的md5sum)时才会运行

角色/main.yml如下所示:

----
- name: Has this already been done? Check for the script, & it's md5sum
  command: md5sum /usr/sbin/sendmail.postfix
  register: md5sum
  ignore_errors: True

- name: What's the value of md5sum?
  debug: var=md5sum

- include: dontrunthen.yml
  when: md5sum.stdout == "e420fc39246a11c890b30b71dda4f976"

- include: dontrunthen.yml
  when: md5sum.stdout == "ac0e57862902c2b11c7dfcdca5a79c30"

- include: runme_postfix.yml
  when: md5sum.stdout != "e420fc39246a11c890b30b71dda4f976"
MD5 (/usr/sbin/sendmail.postfix) = e420fc39246a11c890b30b71dda4f976
该md5sum定义为相关文件的md5sum:

# md5sum /usr/sbin/sendmail.postfix
e420fc39246a11c890b30b71dda4f976  /usr/sbin/sendmail.postfix
然而,当我运行剧本时,它“跳过”了应该让角色使用dontrunthen.yml剧本的步骤。然后在runme_postfix.yml中运行任务。dontrunthen.yml应该以失败告终:

---
- name: We don't need to run if we've made it here...
  fail: msg="Looks like this role has already been applied, try checking the file that should have been created
知道为什么会这样吗?这不是我所期望的行为。我还有其他工作角色,这些角色根据操作系统等有条件地运行


另外,对于可以和when语句一起使用的术语,如varname.stdout、varname.stderr等,是否有很好的参考。?Ansible文档中有很多不同的提及和使用,但我似乎找不到任何地方有这些记录。

可能只是输出不匹配吗?在我看来,
md5
输出是

e420fc39246a11c890b30b71dda4f976  /usr/sbin/sendmail.postfix
当您将其与字符串进行比较时

e420fc39246a11c890b30b71dda4f976
输出似乎非常依赖于系统。在我的系统上,它如下所示:

----
- name: Has this already been done? Check for the script, & it's md5sum
  command: md5sum /usr/sbin/sendmail.postfix
  register: md5sum
  ignore_errors: True

- name: What's the value of md5sum?
  debug: var=md5sum

- include: dontrunthen.yml
  when: md5sum.stdout == "e420fc39246a11c890b30b71dda4f976"

- include: dontrunthen.yml
  when: md5sum.stdout == "ac0e57862902c2b11c7dfcdca5a79c30"

- include: runme_postfix.yml
  when: md5sum.stdout != "e420fc39246a11c890b30b71dda4f976"
MD5 (/usr/sbin/sendmail.postfix) = e420fc39246a11c890b30b71dda4f976
如果这是问题所在,我会看到两种选择:

  • 使
    md5
    仅显示校验和,它有一个
    -q
    (相当)参数
  • 搜索
    stdout
    ,例如当md5sum.stdout中的“e420fc39246a11c890b30b71dda4f976”时搜索

  • 您可以使用此选项,它正在进行测试和验证

    # md5sum /etc/postfix/post-install
    5313a1031ec70f23e945b383a8f83e92  /etc/postfix/post-install
    
    site.yml - 
    
    - hosts: server1
      gather_facts: yes
      tasks:
       - name: Get CheckSum
         stat: path=/etc/postfix/post-install get_md5=True
         register: result
    
       - name: Display CheckSum
         debug: msg="{{ result.stat.md5 }}"
    
    - hosts: server1
      roles:
         - { role: test, when: "'{{ result.stat.md5 }}' == '5313a1031ec70f23e945b383a8f83e92'" }
    
    
    Test Role - 
    
    - name: Test Disk Usage
      command: df -h
    
    如果一切顺利的话,输出将是-

    #ansible playbook-i ansible_hosts site.yml-u root-v

    PLAY [server1] *****************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [172.28.128.7]
    
    TASK: [Get CheckSum] **********************************************************
    ok: [172.28.128.7] => {"changed": false, "stat": {"atime": 1434005428.9124238, "checksum": "392e68986292b30efb1afbeccfd9f90664750dce", "ctime": 1432304683.9521008, "dev": 2049, "exists": true, "gid": 0, "inode": 266042, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "md5": "5313a1031ec70f23e945b383a8f83e92", "mode": "0755", "mtime": 1423161372.0, "nlink": 1, "pw_name": "root", "rgrp": true, "roth": true, "rusr": true, "size": 28047, "uid": 0, "wgrp": false, "woth": false, "wusr": true, "xgrp": true, "xoth": true, "xusr": true}}
    
    TASK: [Display CheckSum] ******************************************************
    ok: [172.28.128.7] => {
        "msg": "5313a1031ec70f23e945b383a8f83e92"
    }
    
    PLAY [server1] *****************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [172.28.128.7]
    
    TASK: [test | Test Disk Usage] ************************************************
    changed: [172.28.128.7] => {"changed": true, "cmd": ["df", "-h"], "delta": "0:00:00.003426", "end": "2015-06-11 08:47:55.574780", "rc": 0, "start": "2015-06-11 08:47:55.571354", "stderr": "", "stdout": "Filesystem      Size  Used Avail Use% Mounted on\n/dev/sda1        40G  1.5G   37G   4% /\nnone            4.0K     0  4.0K   0% /sys/fs/cgroup\nudev            241M   12K  241M   1% /dev\ntmpfs            49M  372K   49M   1% /run\nnone            5.0M     0  5.0M   0% /run/lock\nnone            245M     0  245M   0% /run/shm\nnone            100M     0  100M   0% /run/user\nvagrant         465G  165G  301G  36% /vagrant", "warnings": []}
    
    PLAY RECAP ********************************************************************
    172.28.128.7               : ok=5    changed=1    unreachable=0    failed=0
    

    我希望这能满足您的要求。

    ohh..我从未注意到
    stat
    模块有
    get\u md5
    get\u checksum
    (对于sha1)参数。这比使用command:module要好得多。