File mode with SetGID bit set gets wrong permissions.

  • name: Create test
    file:
    path: /srv/test
    state: directory
    mode: 2770
    owner: root
    group: admin

Output of -v

{“changed”: true, “gid”: 6003, “group”: “admin”, “mode”: “05322”, “owner”: “root”, “path”: “/srv/test”, “size”: 4096, “state”: “directory”, “uid”: 0}

So the mode of 2770 somehow gets converted to 05322

So any mode with SetGID, SetUID or SetSticky, gets mangled.
Tried in 1.6 and 1.7

1770 → 03352

2770 → 05322
4770 → 01242

I should convert the end permissions to octal and see if there is a pattern. Will do later. Just want to post this for now and see if someone knows anything about this.

Thanks
Deon

There’s no leading “0” on your mode number 2770. In Perl, the run-time parses numbers as decimal unless they have certain hint prefixes, like “0x” for hexadecimal and “0” for octal.

I don’t know how Python parses numbers, but 2770 decimal = 5322 octal, so it looks like that may be the source of the confusion. The ansible.com docs for the file module don’t address this explicitly, but both the examples have a leading “0” in the mode number. It looks to me like a mode number of “02770” is what you need.

-Greg

Ansible contains some fuzzy logic for this.

Basically, if the number is a string, it will assume octal.

If you pass in a decimal, as you have done above, it will assume you know what you are doing. (Most people use short-form arguments in Ansible, here you’ve split to another line and passed a decimal - which is fine).

So yes, this would be it.

Alternatively, this would also fit:

mode: “777”

Thank you Greg and Michael.

That was the whole solution to the problem.