何时评估with_items中的值列表的条件

时间:2019-03-01 20:00:27

标签: ansible

我对下面的剧本的意图是仅在从disk_list中找到任何值时才运行shell命令。如上文所述,我需要帮助来确定状况。

---
- hosts: localhost
  connection: local
  gather_facts: false
  tasks:
  - set_fact:
     disk_list:
      - sda
      - sdb
      - sdc

  - name: Get df -hT output to know XFS file system
    shell: df -hT |grep xfs|awk '{print $1}'
    register: df_result

  - name: Run shell command on each XFS file system
    shell: ls -l {{ item }} | awk '{print $1}'
    with_items: "{{ df_result.stdout_lines }}"
    when: "{{ disk_list.[] }} in {{ item }}"

顺便说一句,在我的系统中,“ df_result”变量如下所示:

TASK [debug] ***************************************************************************************************************************************
ok: [localhost] => {
    "df_result": {
        "changed": true, 
        "cmd": "df -hT |grep xfs|awk '{print $1}'", 
        "delta": "0:00:00.017588", 
        "end": "2019-03-01 23:55:21.318871", 
        "failed": false, 
        "rc": 0, 
        "start": "2019-03-01 23:55:21.301283", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "/dev/sda3\n/dev/sda1", 
        "stdout_lines": [
            "/dev/sda3", 
            "/dev/sda1"
        ]
    }
}

请帮助!

1 个答案:

答案 0 :(得分:0)

剧本上的一些笔记。

  1. 对于localhost,连接:本地是隐式的。因此,不需要技术上对此进行指定。

  2. set_fact是正确的,但是在这种情况下,我认为更适合在播放级别使用“ vars”而不是在任务中使用set_fact模块。这也使您可以使用“ vars_files”来更轻松地使用磁盘设备列表。

  3. 我建议尝试使您的任务名称保持“简单”,因为您有时可能希望使用--start-at-task选项。

  4. with_items偏重于“循环”。

  5. 条件“何时”在任务级别工作。因此,如果满足条件,它将执行任务(针对其所有项目)。

这是您需要的工作版本,它也反映了提出的(5)条建议:

---
- hosts: localhost
  gather_facts: false

  vars:
    disk_list:
      - sda
      - sdb
      - sdc

   tasks:

    - name: cleans previous runs
      shell: cat /dev/null > /tmp/df_result

    - name: creates temporary file
      shell: df -hT | grep ext4 | grep -i {{ item }} | awk '{print $1}' >> /tmp/df_result
      loop: "{{ disk_list }}"

    - name: creates variable
      shell: cat /tmp/df_result
      register: df_result

    - name: shows info
      shell: ls -l {{ item }} | awk '{print $1}'
      loop: "{{ df_result.stdout_lines }}"

我基本上只是使用一个临时文件(/ tmp / df_result),而您需要的结果已由任务“创建临时文件”循环中使用的“ grep -i {{item}}”过滤。然后,“显示信息”中的循环仅遍历已经很干净的项目列表。

要在屏幕上查看结果,可以在运行剧本时使用“ -v”选项,或者如果要将结果保存到文件中,则可以在“ ./tmp/df_final”末尾添加“ >> / tmp / df_final” “显示信息”任务中的shell行。

我不小心踩到了这个帖子,它有点陈旧。我相信您已经在您的环境中解决了这个问题,也许您找到了更好的方法,希望您做到了。

此致