我的文件夹结构是这样的:
ansible
|── inventory
|── roles
└── various ansible stuff
Dockerfile
krb5.conf
我已经正确设置了Kerberos,并且可以在计算机上运行所有Ansible剧本而没有任何问题。但是当我将Ansible放入容器后尝试执行相同的操作时,会出现一些问题。
这是我的Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get -y install sshpass
RUN apt-add-repository ppa:ansible/ansible
RUN apt-get update
RUN apt-get -y install ansible
RUN apt-get -y install python-dev libkrb5-dev krb5-user
RUN wget https://bootstrap.pypa.io/get-pip.py
RUN python get-pip.py
RUN pip install pywinrm[kerberos]
ADD ./krb5.conf /etc/krb5.conf
VOLUME /ansible
RUN apt-get -y install curl
我首先docker build -t ansible .
构建容器,然后使用docker run -it -p 5985:5985 -p 5986:5986 -v $(pwd)/ansible:/ansible ansible
运行容器
使用SSH或WinRM直接连接而不通过Kerberos的主机仍然可以使用,可以连接,并且剧本仍在运行。但是对于通过Kerberos的主机,任何命令都将返回UNREACHABLE! => {"changed": false, "msg": "kerberos: Bad HTTP response returned from server. Code 500", "unreachable": true}
我的库存文件示例:
working_host:
hosts:
working:
ansible_host: working.host
ansible_connection: winrm
ansible_port: 5986
ansible_user: admin
ansible_password: admin
ansible_winrm_server_cert_validation: ignore
not_working_host:
hosts:
not_working:
ansible_host: not-working.host
ansible_connection: winrm
ansible_port: 5985
ansible_user: user@DOMA.IN
ansible_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
RANDOM_ENCRYPTED_PASSWORD
ansible_winrm_server_cert_validation: ignore
我的krb5.conf就是这样
[libdefaults]
default_realm = DOMA.IN
[realms]
DOMA.IN = {
kdc = doma.in
}
[domain_realm]
doma.in = DOMA.IN
我可以ping通主机,并且成功卷曲到not-working.host:5985
并返回与在容器外尝试时相同的结果。容器还可以ping doma.in
。
所以,问题是:到底发生了什么?为什么容器仅对通过Kerberos连接的Windows主机不起作用?我该如何解决?