diff --git a/pyinfra/operations/server.py b/pyinfra/operations/server.py index 29335e849..d8dbb20c3 100644 --- a/pyinfra/operations/server.py +++ b/pyinfra/operations/server.py @@ -764,6 +764,7 @@ def user( shell: str | None = None, group: str | None = None, groups: list[str] | None = None, + append=False, public_keys: str | list[str] | None = None, delete_keys=False, ensure_home=True, @@ -783,6 +784,7 @@ def user( + shell: the users shell + group: the users primary group + groups: the users secondary groups + + append: whether to add `user` to `groups`, w/o losing membership of other groups + public_keys: list of public keys to attach to this user, ``home`` must be specified + delete_keys: whether to remove any keys not specified in ``public_keys`` + ensure_home: whether to ensure the ``home`` directory exists @@ -929,6 +931,8 @@ def user( # Check secondary groups, if defined if groups and set(existing_user["groups"]) != set(groups): + if append: + args.append("-a") args.append("-G {0}".format(",".join(groups))) if comment and existing_user["comment"] != comment: diff --git a/tests/operations/server.user/append_secondary_groups.json b/tests/operations/server.user/append_secondary_groups.json new file mode 100644 index 000000000..6db6d8bae --- /dev/null +++ b/tests/operations/server.user/append_secondary_groups.json @@ -0,0 +1,36 @@ +{ + "args": ["someuser"], + "kwargs": { + "group": "somegroup", + "groups": [ + "group3", "group4" + ], + "append": true + }, + "facts": { + "server.Os": "Linux", + "server.Users": { + "someuser": { + "home": "/home/someuser", + "group": "somegroup", + "groups": [ + "group1", "group2" + ] + } + }, + "files.Directory": { + "path=/home/someuser": { + "user": "someuser", + "group": "somegroup" + }, + "path=/home/someotheruser": { + "user": "someuser", + "group": "somegroup" + } + }, + "server.Groups": {} + }, + "commands": [ + "usermod -a -G group3,group4 someuser" + ] +}