当条件为真时 Ansible 跳过

佩德罗·戈多

如果找不到安装的磁盘,我想格式化它。为此,我有以下任务:

- name: Check if drives are already mounted
  shell: df | grep "{{item.drive}}" | wc -l
  with_items: "{{disks}}"
  register: disks_checked
  changed_when: False

- name: output debug
  debug: var=disks_checked

- name: Make filesystem
  become: yes
  filesystem:
    fstype: ext4
    dev: "{{item.item.drive}}"
    opts: -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard"
  when: "item.stdout == 0"
  with_items: '{{disks_checked.results}}'

这是剧本运行:

TASK [install-cassandra : Check if drives are already mounted] *********************************************************************************************************************************
ok: [10.142.0.3] => (item={u'directory': u'/var/lib/mysql', u'mount_point': u'/mnt/disks', u'drive': u'/dev/sdb'})
TASK [install-cassandra : output debug] ********************************************************************************************************************************************************
ok: [10.142.0.3] => {
    "disks_checked": {
        "changed": false, 
        "msg": "All items completed", 
        "results": [
            {
                "_ansible_ignore_errors": null, 
                "_ansible_item_label": {
                    "directory": "/var/lib/mysql", 
                    "drive": "/dev/sdb", 
                    "mount_point": "/mnt/disks"
                }, 
                "_ansible_item_result": true, 
                "_ansible_no_log": false, 
                "_ansible_parsed": true, 
                "changed": false, 
                "cmd": "df | grep \"/dev/sdb\" | wc -l", 
                "delta": "0:00:00.005613", 
                "end": "2019-03-07 09:48:50.293829", 
                "failed": false, 
                "invocation": {
                    "module_args": {
                        "_raw_params": "df | grep \"/dev/sdb\" | wc -l", 
                        "_uses_shell": true, 
                        "argv": null, 
                        "chdir": null, 
                        "creates": null, 
                        "executable": null, 
                        "removes": null, 
                        "stdin": null, 
                        "warn": true
                    }
                }, 
                "item": {
                    "directory": "/var/lib/mysql", 
                    "drive": "/dev/sdb", 
                    "mount_point": "/mnt/disks"
                }, 
                "rc": 0, 
                "start": "2019-03-07 09:48:50.288216", 
                "stderr": "", 
                "stderr_lines": [], 
                "stdout": "0", 
                "stdout_lines": [
                    "0"
                ]
            }
        ]
    }
}

TASK [install-cassandra : Make filesystem] *****************************************************************************************************************************************************
skipping: [10.142.0.3] => (item={'_ansible_parsed': True, 'stderr_lines': [], u'changed': False, u'stdout': u'0', '_ansible_item_result': True, u'delta': u'0:00:00.005613', 'stdout_lines': [u'
0'], '_ansible_item_label': {u'directory': u'/var/lib/mysql', u'mount_point': u'/mnt/disks', u'drive': u'/dev/sdb'}, u'end': u'2019-03-07 09:48:50.293829', '_ansible_no_log': False, 'failed': 
False, u'cmd': u'df | grep "/dev/sdb" | wc -l', 'item': {u'directory': u'/var/lib/mysql', u'mount_point': u'/mnt/disks', u'drive': u'/dev/sdb'}, u'stderr': u'', u'rc': 0, u'invocation': {u'mod
ule_args': {u'warn': True, u'executable': None, u'_uses_shell': True, u'_raw_params': u'df | grep "/dev/sdb" | wc -l', u'removes': None, u'argv': None, u'creates': None, u'chdir': None, u'stdi
n': None}}, u'start': u'2019-03-07 09:48:50.288216', '_ansible_ignore_errors': None})   

如您所见,stdout 为“0”,但在评估when: "item.stdout == 0"最后一个任务中的条件时,它会跳过,就好像条件为假一样。
如果我将条件更改为when: "item.stdout == '0'",那么最后一个任务的错误会变得更奇怪:

TASK [install-cassandra : Make filesystem] *****************************************************************************************************************************************************
failed: [10.142.0.3] (...) "module_stderr": "Shared connection to 10.142.0.3 closed.\r\n"(...)

为什么没有按预期评估条件?为什么它会在第二种情况下断开连接?

佩德罗·戈多

好吧,正如 CERN_Fan 指出的那样,第二个解决方案应该有效......问题是opts尾的那句话......我不敢相信我在其他地方寻找问题时浪费了 2 个小时。

我保留答案和问题,因为错误(连接关闭)与问题无关,其他人可能会遇到这个问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果条件被跳过,即使条件为真

来自分类Dev

即使条件为真,也跳过if {}吗?

来自分类Dev

跳过Ansible的整个循环

来自分类Dev

当Ansible执行脚本时跳过shell命令

来自分类Dev

Ansible跳过了我的标签

来自分类Dev

在满足条件的情况下,在跳过jira任务的条件时,使用先前分配的set_fact的值进行Ansible

来自分类Dev

循环时跳过条件

来自分类Dev

Ansible - 当循环中至少一项失败时跳过任务

来自分类Dev

如何在Ansible中跳过角色执行

来自分类Dev

无论如何,Ansible变量都会跳过

来自分类Dev

如何在Ansible中跳过角色执行

来自分类Dev

ansible:静默跳过无法访问的主机

来自分类Dev

使用 Ansible 运行 Cloudformation,跳过任务

来自分类Dev

在运行Ansible剧本的机器上让ansible跳过运行剧本

来自分类Dev

Where子句跳过条件

来自分类Dev

Python,函数跳过条件

来自分类Dev

条件语句被跳过

来自分类Dev

如果语句被跳过,即使该语句为真

来自分类Dev

引导时跳过Grub

来自分类Dev

引导时跳过Grub

来自分类Dev

在检查模式下运行时跳过Ansible任务?

来自分类Dev

为什么Ansible跳过主机组却什么也不做

来自分类Dev

如何在Ansible中隐藏跳过的任务输出

来自分类Dev

在ansible with_items循环中跳过某些项目

来自分类Dev

如果是组成员,如何跳过Ansible主机

来自分类Dev

如何在Ansible循环中跳过空值

来自分类Dev

在ansible with_items循环中跳过某些项目

来自分类Dev

为什么当我的条件为true时我的if循环会被跳过?

来自分类Dev

php继续跳过条件评估