# selinux issue

**URL:** <https://forum.ansible.com/t/selinux-issue/38684>\
**Category:** Ansible Project\
**Created:** [February 11, 2024, 11:30pm UTC](https://forum.ansible.com/t/selinux-issue/38684 "2024-02-11T23:30:49Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Sergey\_Glazyrin](https://avatars.discourse-cdn.com/v4/letter/s/ac91a4/32.png) [@Sergey\_Glazyrin](https://forum.ansible.com/u/Sergey_Glazyrin)\
**Post date:** [February 11, 2024, 11:30pm UTC](https://forum.ansible.com/t/selinux-issue/38684/1 "2024-02-11T23:30:49Z")

</div>

Hello guys  
I do use linux on local pc and selinux enabled, though there’s no context for the folders/files/etc  
And I am getting following issue:  
Recursion error when ansible trying to build the json it failed with.  
I am getting it when I am trying to create directory using tempfile module, with parameters:  
“invocation”: {  
“module\_args”: {  
“path”: “/tmp/”,  
“prefix”: “buildproject-Bk4mnluds1J6XoC28KyR0QzUgSVVpgSJBxQ7JlWf”,  
“state”: “directory”,  
“suffix”: “”  
}  
},

Traceback:  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/basic.py”, line 679, in selinux\_context

self.fail\_json(path=path, msg=‘failed to retrieve selinux context’)  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/basic.py”, line 1531, in fail\_json  
self.\_return\_formatted(kwargs)  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/basic.py”, line 1459, in \_return\_formatted  
self.add\_path\_info(kwargs)  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/basic.py”, line 1212, in add\_path\_info  
kwargs[‘secontext’] = ‘:’.join(self.selinux\_context(path))  
^^^^^^^^^^^^^^^^^^^^^^^^^^  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/basic.py”, line 679, in selinux\_context  
self.fail\_json(path=path, msg=‘failed to retrieve selinux context’)  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/basic.py”, line 1531, in fail\_json  
self.\_return\_formatted(kwargs)  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/basic.py”, line 1459, in \_return\_formatted  
self.add\_path\_info(kwargs)  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/basic.py”, line 1212, in add\_path\_info  
kwargs[‘secontext’] = ‘:’.join(self.selinux\_context(path))  
^^^^^^^^^^^^^^^^^^^^^^^^^^  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/basic.py”, line 679, in selinux\_context  
self.fail\_json(path=path, msg=‘failed to retrieve selinux context’)  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/basic.py”, line 1531, in fail\_json  
self.\_return\_formatted(kwargs)  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/basic.py”, line 1459, in \_return\_formatted  
self.add\_path\_info(kwargs)  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/basic.py”, line 1212, in add\_path\_info  
kwargs[‘secontext’] = ‘:’.join(self.selinux\_context(path))  
^^^^^^^^^^^^^^^^^^^^^^^^^^  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/basic.py”, line 674, in selinux\_context  
ret = selinux.lgetfilecon\_raw(to\_native(path, errors=‘surrogate\_or\_strict’))  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
File “/tmp/ansible\_tempfile\_payload\_qfnjn5co/ansible\_tempfile\_payload.zip/ansible/module\_utils/compat/selinux.py”, line 95, in lgetfilecon\_raw  
rc = \_selinux\_lib.lgetfilecon\_raw(path, byref(con))  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
ctypes.ArgumentError: argument 1: RecursionError: maximum recursion depth exceeded  
fatal: [127.0.0.1]: FAILED! =\> {  
“changed”: false,  
“invocation”: {  
“module\_args”: {  
“path”: “/tmp/”,  
“prefix”: “buildproject-Bk4mnluds1J6XoC28KyR0QzUgSVVpgSJBxQ7JlWf”,  
“state”: “directory”,  
“suffix”: “”  
}  
},  
“msg”: “argument 1: RecursionError: maximum recursion depth exceeded”  
}

---

<div class="post-metadata">

**Author:** ![Rilindo\_Foster1](https://avatars.discourse-cdn.com/v4/letter/r/8e8cbc/32.png) [@Rilindo\_Foster1](https://forum.ansible.com/u/Rilindo_Foster1)\
**Post date:** [February 11, 2024, 11:36pm UTC](https://forum.ansible.com/t/selinux-issue/38684/2 "2024-02-11T23:36:34Z")

</div>

That is gnarly.

Can you provide the play code that attempted to perform this operation?

Rilindo

---

<div class="post-metadata">

**Author:** ![Sergey\_Glazyrin](https://avatars.discourse-cdn.com/v4/letter/s/ac91a4/32.png) [@Sergey\_Glazyrin](https://forum.ansible.com/u/Sergey_Glazyrin)\
**Post date:** [February 11, 2024, 11:48pm UTC](https://forum.ansible.com/t/selinux-issue/38684/3 "2024-02-11T23:48:03Z")

</div>

Here it is  
ANSIBLE\_KEEP\_REMOTE\_FILES=1 ansible localhost -m tempfile -a “path=/tmp/ prefix=buildproject state=directory” -vvv

And I debugged it, it’s not able to get data about selinux context because it’s not set, it’s triggering OSError with code 61.  
and then it’s trying to build up json about failure and it’s simply get to the recursion…

---

<div class="post-metadata">

**Author:** ![Rilindo\_Foster1](https://avatars.discourse-cdn.com/v4/letter/r/8e8cbc/32.png) [@Rilindo\_Foster1](https://forum.ansible.com/u/Rilindo_Foster1)\
**Post date:** [February 12, 2024, 12:57am UTC](https://forum.ansible.com/t/selinux-issue/38684/4 "2024-02-12T00:57:35Z")

</div>

I am not able to reproduce the error, at least with ansible core 2.15.3:

[rilindo@podman01 ~]$ getenforce

Enforcing

[rilindo@podman01 ~]$ ANSIBLE\_KEEP\_REMOTE\_FILES=1 ansible localhost -m tempfile -a “path=/tmp/ prefix=buildproject state=directory” -vvv

ansible [core 2.15.3]

config file = /etc/ansible/ansible.cfg

configured module search path = [‘/home/rilindo/.ansible/plugins/modules’, ‘/usr/share/ansible/plugins/modules’]

ansible python module location = /usr/lib/python3.11/site-packages/ansible

ansible collection location = /home/rilindo/.ansible/collections:/usr/share/ansible/collections

executable location = /usr/bin/ansible

python version = 3.11.5 (main, Oct 25 2023, 16:19:59) [GCC 8.5.0 20210514 (Red Hat 8.5.0-20)] (/usr/bin/python3.11)

jinja version = 3.1.2

libyaml = True

Using /etc/ansible/ansible.cfg as config file

host\_list declined parsing /etc/ansible/hosts as it did not pass its verify\_file() method

script declined parsing /etc/ansible/hosts as it did not pass its verify\_file() method

auto declined parsing /etc/ansible/hosts as it did not pass its verify\_file() method

Parsed /etc/ansible/hosts inventory source with ini plugin

Skipping callback ‘default’, as we already have a stdout callback.

Skipping callback ‘minimal’, as we already have a stdout callback.

Skipping callback ‘oneline’, as we already have a stdout callback.

\<127.0.0.1\> ESTABLISH LOCAL CONNECTION FOR USER: rilindo

\<127.0.0.1\> EXEC /bin/sh -c ‘echo ~rilindo && sleep 0’

\<127.0.0.1\> EXEC /bin/sh -c ‘( umask 77 && mkdir -p “`echo /home/rilindo/.ansible/tmp`”&& mkdir “`echo /home/rilindo/.ansible/tmp/ansible-tmp-1707699264.9183002-64356-88319939050553`” && echo ansible-tmp-1707699264.9183002-64356-88319939050553=“`echo /home/rilindo/.ansible/tmp/ansible-tmp-1707699264.9183002-64356-88319939050553`” ) && sleep 0’

Using module file /usr/lib/python3.11/site-packages/ansible/modules/tempfile.py

\<127.0.0.1\> PUT /home/rilindo/.ansible/tmp/ansible-local-62330a2uwxtzt/tmp001liao1 TO /home/rilindo/.ansible/tmp/ansible-tmp-1707699264.9183002-64356-88319939050553/AnsiballZ\_tempfile.py

\<127.0.0.1\> EXEC /bin/sh -c ‘chmod u+x /home/rilindo/.ansible/tmp/ansible-tmp-1707699264.9183002-64356-88319939050553/ /home/rilindo/.ansible/tmp/ansible-tmp-1707699264.9183002-64356-88319939050553/AnsiballZ\_tempfile.py && sleep 0’

\<127.0.0.1\> EXEC /bin/sh -c ‘/usr/bin/python3.11 /home/rilindo/.ansible/tmp/ansible-tmp-1707699264.9183002-64356-88319939050553/AnsiballZ\_tempfile.py && sleep 0’

localhost | CHANGED =\> {

“changed”: true,

“gid”: 1000,

“group”: “rilindo”,

“invocation”: {

“module\_args”: {

“path”: “/tmp/”,

“prefix”: “buildproject”,

“state”: “directory”,

“suffix”: “”

}

},

“mode”: “0700”,

“owner”: “rilindo”,

“path”: “/tmp/buildproject\_zi01c58”,

“secontext”: “unconfined\_u:object\_r:user\_tmp\_t:s0”,

“size”: 6,

“state”: “directory”,

“uid”: 1000

}

Perhaps it is something that is unique to your local system. Have you been able to reproduce in any other system?

- Rilindo

---

<div class="post-metadata">

**Author:** ![Sergey\_Glazyrin](https://avatars.discourse-cdn.com/v4/letter/s/ac91a4/32.png) [@Sergey\_Glazyrin](https://forum.ansible.com/u/Sergey_Glazyrin)\
**Post date:** [February 12, 2024, 6:44am UTC](https://forum.ansible.com/t/selinux-issue/38684/5 "2024-02-12T06:44:06Z")

</div>

No, it works in another system. The problem is that I don’t have selinux context on the system… I don’t remember that I set it up explicitly but maybe something changed after I updated gentoo

---

<div class="post-metadata">

**Author:** ![Sergey\_Glazyrin](https://avatars.discourse-cdn.com/v4/letter/s/ac91a4/32.png) [@Sergey\_Glazyrin](https://forum.ansible.com/u/Sergey_Glazyrin)\
**Post date:** [February 12, 2024, 6:44am UTC](https://forum.ansible.com/t/selinux-issue/38684/6 "2024-02-12T06:44:44Z")

</div>

selinux context in the system → selinux context for this path
