Ansible 服务任务失败并显示“无法找到请求的服务 XXX”

ayy*_*rex 13 kerberos ansible ansible-2.x

我正在尝试创建 ansible 剧本来在 centos7 上安装和配置 kerberos。

我有一个 yum 安装所需 rpm 的任务

- name: install kerberos
  yum: name={{ item }} state=present
  with_items:
    - krb5-server
    - krb5-libs
Run Code Online (Sandbox Code Playgroud)

以及启动服务的任务

- name: start kerberos service
  service: name=krb5kdc.service state=started enabled=yes
Run Code Online (Sandbox Code Playgroud)

该剧本失败了

TASK [kerberos : start the systemd kerberos service]  ********************************
fatal: [zen_wozniak]: FAILED! => {"changed": false, "msg": "Could not find the requested service krb5kdc.service: host"}
Run Code Online (Sandbox Code Playgroud)

这看起来应该很简单,yum install rpm 然后启动服务,但是服务单元文件甚至找不到。我究竟做错了什么?

为了清楚起见,我使用 ansible 2.4.2.0 和 centos:7.3.1611 docker 基础镜像。

编辑:: yum 安装步骤正在运行...

TASK [kerberos : debug] ***********************************************************************************************
ok: [brave_payne] => {
"result": {
    "changed": false,
    "failed": false,
    "results": [
        {
            "arch": "x86_64",
            "envra": "0:krb5-server-1.15.1-8.el7.x86_64",
            "epoch": "0",
            "name": "krb5-server",
            "release": "8.el7",
            "repo": "base",
            "version": "1.15.1",
            "yumstate": "available"
        },
        {
            "arch": "x86_64",
            "envra": "0:krb5-server-1.15.1-8.el7.x86_64",
            "epoch": "0",
            "name": "krb5-server",
            "release": "8.el7",
            "repo": "installed",
            "version": "1.15.1",
            "yumstate": "installed"
        }
    ]
}
}
Run Code Online (Sandbox Code Playgroud)

登录到失败的 ansible 容器并手动启动如下所示

    [root@94e29c0e8bdd /]# systemctl status krb5kdc.service
Failed to get D-Bus connection: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

是的,容器正在特权运行

docker inspect --format='{{.HostConfig.Privileged}}' 94e29c0e8bdd
true
Run Code Online (Sandbox Code Playgroud)

for*_*een 7

更新:

使用 Ansible systemd模块,您可以添加:daemon_reload: yes


原答案:

这看起来像是一个随机问题。解决方法是从机器运行:

  • systemctl daemon-reload

或者使用 Ansible 运行它:

  • ansible <host> --become -m shell -a 'systemctl daemon-reload'


小智 0

我认为问题的根源在于容器没有特权,因此无法与 dbus 通信,这可能意味着返回到 Ansible 的 systemd 状态包含LoadState=not-found输出中的文本,systemctl show krb5kdc.service这就是导致 Ansible 提供错误的原因得到。