# until: "'string' in variable.stdout"

**URL:** <https://forum.ansible.com/t/until-string-in-variable-stdout/27868>\
**Category:** Ansible Project\
**Created:** [June 25, 2018, 10:37pm UTC](https://forum.ansible.com/t/until-string-in-variable-stdout/27868 "2018-06-25T22:37:42Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Rob\_Christian](https://avatars.discourse-cdn.com/v4/letter/r/57b2e6/32.png) [@Rob\_Christian](https://forum.ansible.com/u/Rob_Christian)\
**Post date:** [June 25, 2018, 10:37pm UTC](https://forum.ansible.com/t/until-string-in-variable-stdout/27868/1 "2018-06-25T22:37:42Z")

</div>

`

- name: Get etcd node(s)  
command: export ETCDCTL\_API=3 && etcdctl endpoint health  
register: etcd\_nodes  
changed\_when: false  
until: “‘healthy’ in etcd\_nodes.stdout”  
retries: 10  
delay: 10

`

Why won’t this work? Been smashing my head against the desk trying every stack overflow example I see, but this `until` statement refuses to work. Why?

`

fatal: [etcd-01]: FAILED! =\> {“msg”: “The conditional check ‘‘healthy’ in etcd\_nodes.stdout’ failed. The error was: error while evaluating conditional (‘healthy’ in etcd\_nodes.stdout): Unable to look up a name or access an attribute in template string ({% if ‘healthy’ in etcd\_nodes.stdout %} True {% else %} False {% endif %}).\nMake sure your variable name does not contain invalid characters like ‘-’: argument of type ‘StrictUndefined’ is not iterable”}

`

---

<div class="post-metadata">

**Author:** ![Rob\_Christian](https://avatars.discourse-cdn.com/v4/letter/r/57b2e6/32.png) [@Rob\_Christian](https://forum.ansible.com/u/Rob_Christian)\
**Post date:** [June 25, 2018, 10:48pm UTC](https://forum.ansible.com/t/until-string-in-variable-stdout/27868/2 "2018-06-25T22:48:43Z")

</div>

Also tried…

`

- name: Get etcd node(s)  
command: export ETCDCTL\_API=3 && etcdctl endpoint health  
register: etcd\_nodes  
changed\_when: false  
until: etcd\_nodes.stdout is search(“_healthy_”)  
retries: 10  
delay: 10

`

`

fatal: [etcd-01]: FAILED! =\> {“msg”: “The conditional check ‘etcd\_nodes.stdout is search("_healthy_")’ failed. The error was: nothing to repeat”}

`

---

<div class="post-metadata">

**Author:** ![flowerysong1](https://avatars.discourse-cdn.com/v4/letter/f/ecae2f/32.png) [@flowerysong1](https://forum.ansible.com/u/flowerysong1)\
**Post date:** [June 25, 2018, 11:35pm UTC](https://forum.ansible.com/t/until-string-in-variable-stdout/27868/3 "2018-06-25T23:35:40Z")

</div>

Ultimately, it’s failing because you’re attempting to use shell features with the command module, which doesn’t use a shell.

Your task is failing without executing anything (returning “[Errno 2] No such file or directory”) because `export` is a shell builtin, not a command. Since nothing executed, there is no `stdout` in your registered variable, so your conditional cannot be evaluated.

There are multiple ways to fix this, but the most correct approach is to use the ‘environment’ keyword to set environment variables:

`

- name: Get etcd node(s)  
command: etcdctl endpoint health  
environment:  
ETCDCTL\_API: 3  
register: etcd\_nodes  
changed\_when: false  
until: “‘healthy’ in etcd\_nodes.stdout”  
retries: 10  
delay: 10

`

---

<div class="post-metadata">

**Author:** ![Rob\_Christian](https://avatars.discourse-cdn.com/v4/letter/r/57b2e6/32.png) [@Rob\_Christian](https://forum.ansible.com/u/Rob_Christian)\
**Post date:** [June 25, 2018, 11:36pm UTC](https://forum.ansible.com/t/until-string-in-variable-stdout/27868/4 "2018-06-25T23:36:42Z")

</div>

`

- name: Get etcd node(s)

command: export ETCDCTL\_API=3 && etcdctl endpoint health  
register: result  
until: result.stdout\_lines.find(‘healthy’) #etcd\_nodes.stdout.find(“healthy”) != -1  
delay: 10  
`

`

fatal: [etcd-01]: FAILED! =\> {“msg”: “The conditional check ‘result.stdout\_lines.find(‘healthy’)’ failed. The error was: error while evaluating conditional (result.stdout\_lines.find(‘healthy’)): ‘dict object’ has no attribute ‘stdout\_lines’”}

`

Same result for `stdout`. So clearly it’s not there, but why? How do I inspect this with Ansible?

---

<div class="post-metadata">

**Author:** ![Rob\_Christian](https://avatars.discourse-cdn.com/v4/letter/r/57b2e6/32.png) [@Rob\_Christian](https://forum.ansible.com/u/Rob_Christian)\
**Post date:** [June 25, 2018, 11:52pm UTC](https://forum.ansible.com/t/until-string-in-variable-stdout/27868/5 "2018-06-25T23:52:40Z")

</div>

flowerysong, that fixed it, thank you!
