a )gK[@sddlmZmZmZeZdZdZdZddl Z ddl m Z ddl m Z ddlmZmZmZdd lmZd d Zd d ZddZddZddZedkredS))absolute_importdivisionprint_functiona module: systemd_service author: - Ansible Core Team version_added: "2.2" short_description: Manage systemd units description: - Controls systemd units (services, timers, and so on) on remote hosts. options: name: description: - Name of the unit. This parameter takes the name of exactly one unit to work with. - When no extension is given, it is implied to a C(.service) as systemd. - When using in a chroot environment you always need to specify the name of the unit with the extension. For example, C(crond.service). type: str aliases: [ service, unit ] state: description: - C(started)/C(stopped) are idempotent actions that will not run commands unless necessary. C(restarted) will always bounce the unit. C(reloaded) will always reload. type: str choices: [ reloaded, restarted, started, stopped ] enabled: description: - Whether the unit should start on boot. B(At least one of state and enabled are required.) type: bool force: description: - Whether to override existing symlinks. type: bool version_added: 2.6 masked: description: - Whether the unit should be masked or not, a masked unit is impossible to start. type: bool daemon_reload: description: - Run daemon-reload before doing any other operations, to make sure systemd has read any changes. - When set to C(true), runs daemon-reload even if the module does not start or stop anything. type: bool default: no aliases: [ daemon-reload ] daemon_reexec: description: - Run daemon_reexec command before doing any other operations, the systemd manager will serialize the manager state. type: bool default: no aliases: [ daemon-reexec ] version_added: "2.8" scope: description: - Run systemctl within a given service manager scope, either as the default system scope C(system), the current user's scope C(user), or the scope of all users C(global). - "For systemd to work with 'user', the executing user must have its own instance of dbus started and accessible (systemd requirement)." - "The user dbus process is normally started during normal login, but not during the run of Ansible tasks. Otherwise you will probably get a 'Failed to connect to bus: no such file or directory' error." - The user must have access, normally given via setting the C(XDG_RUNTIME_DIR) variable, see example below. type: str choices: [ system, user, global ] default: system version_added: "2.7" no_block: description: - Do not synchronously wait for the requested operation to finish. Enqueued job will continue without Ansible blocking on its completion. type: bool default: no version_added: "2.3" extends_documentation_fragment: action_common_attributes attributes: check_mode: support: full diff_mode: support: none platform: platforms: posix notes: - Since 2.4, one of the following options is required C(state), C(enabled), C(masked), C(daemon_reload), (C(daemon_reexec) since 2.8), and all except C(daemon_reload) and (C(daemon_reexec) since 2.8) also require C(name). - Before 2.4 you always required C(name). - Globs are not supported in name, i.e C(postgres*.service). - The service names might vary by specific OS/distribution requirements: - A system managed by systemd. a - name: Make sure a service unit is running ansible.builtin.systemd: state: started name: httpd - name: Stop service cron on debian, if running ansible.builtin.systemd: name: cron state: stopped - name: Restart service cron on centos, in all cases, also issue daemon-reload to pick up config changes ansible.builtin.systemd: state: restarted daemon_reload: true name: crond - name: Reload service httpd, in all cases ansible.builtin.systemd: name: httpd.service state: reloaded - name: Enable service httpd and ensure it is not masked ansible.builtin.systemd: name: httpd enabled: true masked: no - name: Enable a timer unit for dnf-automatic ansible.builtin.systemd: name: dnf-automatic.timer state: started enabled: true - name: Just force systemd to reread configs (2.4 and above) ansible.builtin.systemd: daemon_reload: true - name: Just force systemd to re-execute itself (2.8 and above) ansible.builtin.systemd: daemon_reexec: true - name: Run a user service when XDG_RUNTIME_DIR is not set on remote login ansible.builtin.systemd: name: myservice state: started scope: user environment: XDG_RUNTIME_DIR: "/run/user/{{ myuid }}" aE status: description: A dictionary with the key=value pairs returned from C(systemctl show). returned: success type: complex sample: { "ActiveEnterTimestamp": "Sun 2016-05-15 18:28:49 EDT", "ActiveEnterTimestampMonotonic": "8135942", "ActiveExitTimestampMonotonic": "0", "ActiveState": "active", "After": "auditd.service systemd-user-sessions.service time-sync.target systemd-journald.socket basic.target system.slice", "AllowIsolate": "no", "Before": "shutdown.target multi-user.target", "BlockIOAccounting": "no", "BlockIOWeight": "1000", "CPUAccounting": "no", "CPUSchedulingPolicy": "0", "CPUSchedulingPriority": "0", "CPUSchedulingResetOnFork": "no", "CPUShares": "1024", "CanIsolate": "no", "CanReload": "yes", "CanStart": "yes", "CanStop": "yes", "CapabilityBoundingSet": "18446744073709551615", "ConditionResult": "yes", "ConditionTimestamp": "Sun 2016-05-15 18:28:49 EDT", "ConditionTimestampMonotonic": "7902742", "Conflicts": "shutdown.target", "ControlGroup": "/system.slice/crond.service", "ControlPID": "0", "DefaultDependencies": "yes", "Delegate": "no", "Description": "Command Scheduler", "DevicePolicy": "auto", "EnvironmentFile": "/etc/sysconfig/crond (ignore_errors=no)", "ExecMainCode": "0", "ExecMainExitTimestampMonotonic": "0", "ExecMainPID": "595", "ExecMainStartTimestamp": "Sun 2016-05-15 18:28:49 EDT", "ExecMainStartTimestampMonotonic": "8134990", "ExecMainStatus": "0", "ExecReload": "{ path=/bin/kill ; argv[]=/bin/kill -HUP $MAINPID ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }", "ExecStart": "{ path=/usr/sbin/crond ; argv[]=/usr/sbin/crond -n $CRONDARGS ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }", "FragmentPath": "/usr/lib/systemd/system/crond.service", "GuessMainPID": "yes", "IOScheduling": "0", "Id": "crond.service", "IgnoreOnIsolate": "no", "IgnoreOnSnapshot": "no", "IgnoreSIGPIPE": "yes", "InactiveEnterTimestampMonotonic": "0", "InactiveExitTimestamp": "Sun 2016-05-15 18:28:49 EDT", "InactiveExitTimestampMonotonic": "8135942", "JobTimeoutUSec": "0", "KillMode": "process", "KillSignal": "15", "LimitAS": "18446744073709551615", "LimitCORE": "18446744073709551615", "LimitCPU": "18446744073709551615", "LimitDATA": "18446744073709551615", "LimitFSIZE": "18446744073709551615", "LimitLOCKS": "18446744073709551615", "LimitMEMLOCK": "65536", "LimitMSGQUEUE": "819200", "LimitNICE": "0", "LimitNOFILE": "4096", "LimitNPROC": "3902", "LimitRSS": "18446744073709551615", "LimitRTPRIO": "0", "LimitRTTIME": "18446744073709551615", "LimitSIGPENDING": "3902", "LimitSTACK": "18446744073709551615", "LoadState": "loaded", "MainPID": "595", "MemoryAccounting": "no", "MemoryLimit": "18446744073709551615", "MountFlags": "0", "Names": "crond.service", "NeedDaemonReload": "no", "Nice": "0", "NoNewPrivileges": "no", "NonBlocking": "no", "NotifyAccess": "none", "OOMScoreAdjust": "0", "OnFailureIsolate": "no", "PermissionsStartOnly": "no", "PrivateNetwork": "no", "PrivateTmp": "no", "RefuseManualStart": "no", "RefuseManualStop": "no", "RemainAfterExit": "no", "Requires": "basic.target", "Restart": "no", "RestartUSec": "100ms", "Result": "success", "RootDirectoryStartOnly": "no", "SameProcessGroup": "no", "SecureBits": "0", "SendSIGHUP": "no", "SendSIGKILL": "yes", "Slice": "system.slice", "StandardError": "inherit", "StandardInput": "null", "StandardOutput": "journal", "StartLimitAction": "none", "StartLimitBurst": "5", "StartLimitInterval": "10000000", "StatusErrno": "0", "StopWhenUnneeded": "no", "SubState": "running", "SyslogLevelPrefix": "yes", "SyslogPriority": "30", "TTYReset": "no", "TTYVHangup": "no", "TTYVTDisallocate": "no", "TimeoutStartUSec": "1min 30s", "TimeoutStopUSec": "1min 30s", "TimerSlackNSec": "50000", "Transient": "no", "Type": "simple", "UMask": "0022", "UnitFileState": "enabled", "WantedBy": "multi-user.target", "Wants": "system.slice", "WatchdogTimestampMonotonic": "0", "WatchdogUSec": "0", } N) AnsibleModule) is_chroot) sysv_existssysv_is_enabledfail_if_missing) to_nativecCs|dtddgvS)N ActiveStateZactiveZ activatingsetZservice_statusr;/usr/lib/python3.9/site-packages/ansible/modules/systemd.pyis_running_servicesrcCs|dtdgvS)Nr Z deactivatingr rrrris_deactivating_service"srcCsd|vod|vpd|vS)N=zignoring requestzignoring commandr)outrrrrequest_was_ignored&srcCsi}g}d}|D]}|durxd|vr|dd\}}|drf|drf|dsf||q|||<d}q|||drd|||<g}d}q|S)NrZExec{} )split startswithlstriprstripendswithappendstripjoin)linesparsedZmultivalklinevrrrparse_systemctl_show*s&    r'cCs$tttdddgdtdgddtddtddtddtdd d gd tdd d gd tdd gddtdd dd dgdgtddddd}|jd}|durdD] }||vr|jd||fdq|dd}tddurdttjd<|jdd kr|d|jd7}|jd r(|d!7}|jd"r<|d#7}d$}d%}}t|d td&}|jd'r|j s| d(|\}}}|d$kr|jd)||fd|jd*r|j s| d+|\}}}|d$kr|jd,||fd|rd }t |} d } | d-||f\}}}|d$krt |st |s|rt t|d.|d/<d0|d/voh|d/d0d1k} d0|d/vo|d/d0d2k} | r| sd3|d/vr|jd4||d/d3fdn|r`|d5kr`d6|vr`t t|d.|d/<|d7\} } }d8j| | d9}| d:j||d;\}}}||v} | d<njgd?}| d@||f\}}}||vrd} n6| dA||f\}}}|d$krd} n|j |ddB| p| }| r| s|dC||jd2dur| d@||f\}}}|d2k}||jd2krd|dD<|jd2rLdE}ndF}|j s| dG|||f\}}}|d$krt|||dHd|jdIdur|jdIrdJ}ndK}t|||dHdd }| dL||f\}}}|d$krd}|dMgks |dNgkrPd }n>|d5krP|jdd krP| rP|dOsPt|rPd}||dI<||jdIkrd|dD<|j s| dG|||f\}}}|d$kr|jdP||||fd| |dI<|jdQdurt|||dHd|jdQ|dQ<d>|d/vrd}|jdQdRkr$t|d/sdS}n`|jdQdTkrVt|d/sPt|d/rdU}n.t|d/sjdS}n|jdQddV}dR|dQ<|rd|dD<|j s| dG|||f\}}}|d$kr|jdP|||fdn:t|stjdWdXkr|dYn|jdZ|d/d[|jfi|dS)\NstrZserviceunit)typealiases)ZreloadedZ restartedstartedstopped)r*choicesbool)r*Fz daemon-reload)r*defaultr+z daemon-reexecsystem)r1userglobal)r*r0r.)r*r0) namestateenabledforcemasked daemon_reload daemon_reexecscopeno_blockT)r5r6r8r9r:)r4)r5r6r8)Z argument_specZsupports_check_modeZrequired_one_ofZ required_byr4)*?[zZThis module does not currently support using glob patterns, found '%s' in service name: %s)msg systemctlZXDG_RUNTIME_DIRz /run/user/%sr;z --%sr<z --no-blockr7z --forcer)r4changedstatusr9z%s daemon-reloadz#failure %d during daemon-reload: %sr:z%s daemon-reexecz#failure %d during daemon-reexec: %sz %s show '%s'rrDZ LoadStatez not-foundr8Z LoadErrorz Error loading unit file '%s': %srzFailed to parse bus message@z{unit_base}{sep}) unit_basesepz,{systemctl} list-unit-files '{unit_search}*')rA unit_searchz{systemctl} is-active '{unit}')rAr)r ) r6zenabled-runtimeZlinkedzlinked-runtimer8zmasked-runtimeZstaticindirectdisabledZ generatedZ transientz%s is-enabled '%s'z%s list-unit-files '%s')Zcheck_rczPThe service (%s) is actually an init script but the system is managed by systemdrCmaskZunmaskz %s %s '%s'hostr6enabledisablez%s is-enabled '%s' -lrIaliasrJzUnable to %s service %s: %sr5r,startr-stopZSYSTEMD_OFFLINE1zyTarget is a chroot or systemd is offline. This can lead to false positives or prevent the init system tools from working.zService is in unknown state)r@rD)rdictparamsZ fail_jsonZ get_bin_pathosgetenvgeteuidenvironZ check_modeZ run_commandrrr'r r partitionformatrr warnr splitlinesrrrrrgetZ exit_json)moduler)Z globpatternrArcrerrresultfoundZis_initdZ is_systemdZ is_maskedrFrGsuffixrHZvalid_enabled_statesr8actionr6rrrmainPs"                         rf__main__)Z __future__rrrr*Z __metaclass__Z DOCUMENTATIONZEXAMPLESZRETURNrVZansible.module_utils.basicrZ(ansible.module_utils.facts.system.chrootrZansible.module_utils.servicerrr Zansible.module_utils._textr rrrr'rf__name__rrrrs$W3   &i