<!--- Verify first that your issue is not already reported on GitHub -->
<!--- Also test if the latest release and devel branch are affected too -->
<!--- Complete *all* sections as described, this form is processed automatically -->

##### SUMMARY
<!--- Explain the problem briefly below -->
Ansible user module fails on casting the `expires` value to an `int` when an entry already exists in `/etc/passwd` for a user with the error message `ValueError: invalid literal for int() with base 10: ''`.
https://github.com/ansible/ansible/blob/31ddca4c0db2584b0a68880bdea1d97bd8b22032/lib/ansible/modules/user.py#L800

##### ISSUE TYPE
- Bug Report

##### COMPONENT NAME
<!--- Write the short name of the module, plugin, task or feature below, use your best guess if unsure -->
user module

##### ANSIBLE VERSION
<!--- Paste verbatim output from "ansible --version" between quotes -->
```paste below
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/export/home/rrotaru/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /tech/home/rrotaru/venv/lib64/python3.6/site-packages/ansible
  executable location = /tech/home/rrotaru/venv/bin/ansible
  python version = 3.6.8 (default, Jun 11 2019, 15:15:01) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
```
```
ansible 2.10.1
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/export/home/rrotaru/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /tech/home/rrotaru/venv/lib64/python3.6/site-packages/ansible
  executable location = /tech/home/rrotaru/venv/bin/ansible
  python version = 3.6.8 (default, Jun 11 2019, 15:15:01) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
```

##### CONFIGURATION
<!--- Paste verbatim output from "ansible-config dump --only-changed" between quotes -->
N/A

##### OS / ENVIRONMENT
<!--- Provide all relevant information below, e.g. target OS versions, network device firmware, etc. -->
Red Hat Enterprise Linux Server release 7.5 (Maipo)


##### STEPS TO REPRODUCE
<!--- Describe exactly how to reproduce the problem, using a minimal test-case -->
Run the playbook below.


<!--- Paste example playbooks or commands between quotes below -->
```yaml
---

- hosts: localhost
  become: yes
  tasks:

    - lineinfile:
        path: /etc/passwd
        line: "dummy::123:123::/export/home/dummy:/bin/ksh"
        regexp: "^dummy.*"
        state: present

    - user:
        name: dummy
        state: present
        uid: 123
        expires: -1
        password: "dummy#password | password_hash('sha512') }}"
```

<!--- HINT: You can paste gist.github.com links for larger files -->

##### EXPECTED RESULTS
<!--- Describe what you expected to happen when running the steps above -->
User module should update the user expiration to non-expiring.

##### ACTUAL RESULTS
<!--- Describe what actually happened. If possible run with extra verbosity (-vvvv) -->
User module fails with python ValueError.

<!--- Paste verbatim command output between quotes -->
```paste below
(venv) $ ansible-playbook expirestest.yml -K -v
Using /etc/ansible/ansible.cfg as config file
BECOME password:
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit
localhost does not match 'all'

PLAY [localhost] *******************************************************************************

TASK [Gathering Facts] *************************************************************************
ok: [localhost]

TASK [lineinfile] ******************************************************************************
changed: [localhost] => {"backup": "", "changed": true, "msg": "line added"}

TASK [user] ************************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: ValueError: invalid literal for int() with base 10: ''
fatal: [localhost]: FAILED! => {"changed": false, "module_stderr": "Traceback (most recent call last):\n  File \"/export/home/rrotaru/.ansible/tmp/ansible-tmp-1600960729.601071-12482-194155520219212/AnsiballZ_user.py\", line 102, in <module>\n    _ansiballz_main()\n  File \"/export/home/rrotaru/.ansible/tmp/ansible-tmp-1600960729.601071-12482-194155520219212/AnsiballZ_user.py\", line 94, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/export/home/rrotaru/.ansible/tmp/ansible-tmp-1600960729.601071-12482-194155520219212/AnsiballZ_user.py\", line 40, in invoke_module\n    runpy.run_module(mod_name='ansible.modules.user', init_globals=None, run_name='__main__', alter_sys=True)\n  File \"/usr/lib64/python3.6/runpy.py\", line 205, in run_module\n    return _run_module_code(code, init_globals, run_name, mod_spec)\n  File \"/usr/lib64/python3.6/runpy.py\", line 96, in _run_module_code\n    mod_name, mod_spec, pkg_name, script_name)\n  File \"/usr/lib64/python3.6/runpy.py\", line 85, in _run_code\n    exec(code, run_globals)\n  File \"/tmp/ansible_user_payload_v5n53kd3/ansible_user_payload.zip/ansible/modules/user.py\", line 3026, in <module>\n  File \"/tmp/ansible_user_payload_v5n53kd3/ansible_user_payload.zip/ansible/modules/user.py\", line 2965, in main\n  File \"/tmp/ansible_user_payload_v5n53kd3/ansible_user_payload.zip/ansible/modules/user.py\", line 1111, in modify_user\n  File \"/tmp/ansible_user_payload_v5n53kd3/ansible_user_payload.zip/ansible/modules/user.py\", line 799, in modify_user_usermod\nValueError: invalid literal for int() with base 10: ''\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}

PLAY RECAP *************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

```

description:
            - Optionally set the user's home directory.
        type: path
    skeleton:
        description:
            - Optionally set a home skeleton directory.
            - Requires O(create_home) option!
        type: str
        version_added: "2.0"
    password:
        description:
            - If provided, set the user's password to the provided encrypted hash (Linux) or plain text password (macOS).
            - B(Linux/Unix/POSIX:) Enter the hashed password as the value.
            - See L(FAQ entry,https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#how-do-i-generate-encrypted-passwords-for-the-user-module)
              for details on various ways to generate the hash of a password.
            - To create an account with a locked/disabled password on Linux systems, set this to V('!') or V('*').
            - To create an account with a locked/disabled password on OpenBSD, set this to V('*************').
            - B(OS X/macOS:) Enter the cleartext password as the value. Be sure to take relevant security precautions.
            - On macOS, the password specified in the C(password) option will always be set, regardless of whether the user account already exists or not.
            - When the password is passed as an argument, the C(user) module will always return changed to C(true) for macOS systems.
              Since macOS no longer provides access to the hashed passwords directly.
        type: str
    state:
        description:
            - Whether the account should exist or not, taking action if the state is different from what is stated.
            - See this L(FAQ entry,https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#running-on-macos-as-a-target)
              for additional requirements when removing users on macOS systems.
        type: str
        choices: [ absent, present ]
        default: present