【问题标题】:Odd ansible behaviour in CentOS containerCentOS 容器中的奇怪行为
【发布时间】:2021-10-19 19:33:09
【问题描述】:

在 CentOS 8 基础容器中使用 ansible 时,我有一些奇怪的行为。我最初所做的只是测试基本功能,本质上是使用来自 gitlab 运行器的 ansible 从另一台机器运行 ping。它应该非常简单,但我遇到了基本身份验证问题。

我已经设置了授权密钥并检查以确保它们适用于从容器主机(带有 podman 的 Centos8)到测试机器以及 CentOS8 的连接,所有这些都可以在 ansible 上正常工作,见下文:

[root@automation home]# ansible all -i lshyp01.lab, -u ansible -v --private-key=/home/ansible/.ssh/id_rsa -a "/usr/sbin/ping -c 3 8.8.8.8"
Using /etc/ansible/ansible.cfg as config file
lshyp01.lab | CHANGED | rc=0 >>
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=5.30 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=5.21 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=117 time=4.97 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 4.967/5.160/5.304/0.153 ms
[root@automation home]# 

但是,当我通过 Gitlab 运行器运行相同的命令时,我得到:

$ useradd ansible
$ mkdir -p /home/ansible/.ssh
$ echo "$SSH_PRIVATE_KEY" | tr -d '\r' > /home/ansible/.ssh/id_rsa
$ chmod -R 744 /home/ansible/.ssh/id_rsa*
$ chown ansible:ansible -R /home/ansible/.ssh
$ export ANSIBLE_HOST_KEY_CHECKING=False
$ ansible all -i lshyp01.lab, -u ansible -v --private-key=/home/ansible/.ssh/id_rsa -a "/usr/sbin/ping -c 3 8.8.8.8"
Using /etc/ansible/ansible.cfg as config file
lshyp01.lab | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added 'lshyp01.lab,10.16.4.19' (ECDSA) to the list of known hosts.\r\nansible@lshyp01.lab: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
    "unreachable": true
}
Cleaning up file based variables
00:00
ERROR: Job failed: exit status 1

这里是 .gitlab-ci.yml 文件:

# Use minimal CentOS7 image
image: centos:latest

# Set up variables
# TF_ROOT: ${CI_PROJECT_DIR}/
# TF_ADDRESS: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/state/prod


stages:
  - prepare
  - validate
  - build
  - deploy

before_script:
  # Install tools - these should be baked into the image for prod
  - which ssh-agent || (dnf -y install openssh-clients)
  - eval $(ssh-agent -s)
  - dnf -y install which
  - which git || (dnf -y install git)
  - which terraform || (dnf install -y dnf-utils && dnf config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo && dnf -y install terraform)
  - which ansible || (dnf -y install epel-release && dnf -y install ansible)
  - which nslookup || (dnf -y install bind-utils)
  - which sudo || (dnf -y install sudo)

  # Seup user
  - useradd ansible
  - mkdir -p /home/ansible/.ssh
  - echo "$SSH_PRIVATE_KEY" | tr -d '\r' > /home/ansible/.ssh/id_rsa
  - chmod -R 744 /home/ansible/.ssh/id_rsa*
  - chown ansible:ansible -R /home/ansible/.ssh


# Pre testing
sshtest:
  stage: prepare
  script:
    - export ANSIBLE_HOST_KEY_CHECKING=False
    - ansible all -i lshyp01.lab, -u ansible -v --private-key=/home/ansible/.ssh/id_rsa -a "/usr/sbin/ping -c 3 8.8.8.8"

我已验证密钥正确。非常感谢任何帮助。

【问题讨论】:

  • 您可以使用 ssh 的详细输出来获得一些清晰度,但我会冒险猜测 mkdir 之后的 /home/ansible/.ssh 的权限是错误的。 ~/.ssh 目录必须是 0700
  • 在运行器中进行简单的 ssh 调试,甚至无需运行 Ansible(即ssh -vvv),应该会显示由于文件权限,使用您的密钥连接不成功,并且正在等待密码。私钥应具有 mod 0600 而不是 0744。您可能对 .ssh 目录的权限也有问题,具体取决于您的默认 umask。

标签: ansible containers gitlab-ci centos8


【解决方案1】:

答案原来是 Gitlab 变量的问题。最后,我必须将密钥编码为 base 64 以存储它们,然后在使用时对其进行解码。更新的 gitlab-ci 部分如下。

正如所指出的,上面的示例也有错误的权限,但是,我尝试了一些选项,我应该在发布之前恢复权限更改,抱歉造成混乱。

  - mkdir -p /root/.ssh
  - echo "$SSH_PRIVATE_KEY" | base64 -d > /root/.ssh/id_rsa
  - echo "$SSH_PUBLIC_KEY" | base64 -d > /root/.ssh/id_rsa.pub
  - chmod -R 600 /root/.ssh/id_rsa && chmod -R 664 /root/.ssh/id_rsa.pub
  - export ANSIBLE_HOST_KEY_CHECKING=False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2020-08-28
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    相关资源
    最近更新 更多