📘 OpenEuler 22.03 Ansible 控制节点完整部署指南(从零到测试通过)

适用系统:openEuler 22.03 LTS / CentOS 8 / Rocky Linux 8 / AlmaLinux 8
目标:在控制节点安装 Ansible,配置 SSH 免密,并完成与被控节点的连通性测试。


一、控制节点:安装 Ansible

1.1 基础环境准备

# 更新软件源(可选,建议执行)
dnf clean all
dnf makecache
dnf update -y

# 关闭 SELinux(避免权限问题,生产环境建议保持启用并配置策略)
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 关闭防火墙(或单独放行 22 端口)
systemctl stop firewalld
systemctl disable firewalld

# 安装依赖(Python3、pip、sshpass)
dnf install -y python3 python3-pip sshpass

1.2 安装 Ansible

# 查看可安装版本(openEuler 22.03 默认 2.14)
dnf list | grep ansible

# 安装
dnf install -y ansible

# 验证
ansible --version
# 期望输出:ansible [core 2.14.2] 或更高

💡 若需更新版本(如 2.16+),可改用 pip 安装:

pip3 install ansible --upgrade

二、控制节点:配置 Ansible

2.1 编辑 /etc/ansible/ansible.cfg

vi /etc/ansible/ansible.cfg

将以下内容取消注释或添加在 [defaults] 段:

[defaults]
host_key_checking = False          # 关闭首次连接主机密钥确认
inventory = /etc/ansible/hosts     # 指定主机清单文件
remote_user = root                 # 默认远程用户(可后续覆盖)
timeout = 30                       # SSH 连接超时(秒)
log_path = /var/log/ansible.log    # 日志记录(便于排错)

2.2 配置主机清单 /etc/ansible/hosts

vi /etc/ansible/hosts

写入以下分组(请替换为您的实际 IP):

[web]
192.168.1.101
192.168.1.102

[db]
192.168.1.103

# 也可定义组变量(例如 web 组使用普通用户)
[web:vars]
ansible_user=root

三、控制节点 → 被控节点:SSH 免密登录(核心)

3.1 生成 SSH 密钥(控制节点)

ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''

3.2 分发公钥到被控节点

方法一:手动逐个分发(需输入密码)
ssh-copy-id root@192.168.1.101
ssh-copy-id root@192.168.1.102
ssh-copy-id root@192.168.1.103
方法二:批量自动分发(使用 sshpass,所有节点密码相同)
# 设置密码变量(注意:执行完后建议清除历史)
PASSWORD="你的root密码"

for ip in 192.168.1.101 192.168.1.102 192.168.1.103; do
  sshpass -p "$PASSWORD" ssh-copy-id -o StrictHostKeyChecking=no root@$ip
done

# 清除历史记录(安全)
history -c
方法三:通过 expect 脚本(略)
方法四:使用 Ansible 自身(先手工复制到一台,再通过该台分发)——不推荐初次使用。

3.3 验证免密登录

ssh root@192.168.1.101 date
ssh root@192.168.1.102 date
ssh root@192.168.1.103 date
# 均无需输入密码即成功

四、被控节点:环境准备(所有被控节点)

虽然可以通过 Ansible Playbook 批量执行,但 首次 建议手工或脚本执行,以确保基础依赖就绪。

4.1 手动登录每台被控节点,执行:

# 安装 Python3(Ansible 依赖)
dnf install -y python3

# 关闭 SELinux 和防火墙(同控制节点)
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld

4.2 更高效:使用 Ansible 一次性完成(需要先确保免密生效)

在控制节点创建 prepare_nodes.yml Playbook:

---
- hosts: all
  become: yes
  tasks:
    - name: 安装 Python3
      dnf:
        name: python3
        state: present

    - name: 临时关闭 SELinux
      command: setenforce 0
      ignore_errors: yes

    - name: 永久禁用 SELinux
      selinux:
        state: disabled

    - name: 停止并禁用 firewalld
      service:
        name: firewalld
        state: stopped
        enabled: no

执行:

ansible-playbook -i /etc/ansible/hosts prepare_nodes.yml

五、连通性测试(控制节点执行)

# 测试所有节点
ansible all -m ping

# 测试指定组
ansible web -m ping

预期输出:

192.168.1.101 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

六、简单功能测试

# 查看所有节点 hostname
ansible all -m command -a "hostname"

# 查看磁盘使用
ansible all -m command -a "df -h"

# 使用 shell 模块(支持管道、重定向)
ansible all -m shell -a "free -m | grep Mem"

七、常见问题与排错

问题现象 可能原因 解决方案
FAILED! => {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled..."} 未关闭主机密钥检查 在 ansible.cfg 中设置 host_key_checking = False
python: command not found 被控节点未安装 Python 手工安装 dnf install -y python3
Permission denied (publickey,password) SSH 免密未成功 重新执行 ssh-copy-id,或检查 /root/.ssh/authorized_keys 权限
No route to host 防火墙或网络不通 检查防火墙、IP 地址、网段
Timeout (30s) 网络延迟或连接被阻断 增加 timeout 值,或检查 SSH 服务状态
WARNING: ansible.utils.display.initialize_locale has not been called 语言环境问题 export LANG=en_US.UTF-8 后重试

八、一键部署控制节点脚本(可选)

将以下内容保存为 setup_ansible_master.sh,赋予执行权限并运行:

#!/bin/bash
# 适用于 openEuler 22.03 / Rocky Linux 8+
set -e

echo "=== 1. 更新系统和安装依赖 ==="
dnf clean all && dnf makecache
dnf install -y python3 python3-pip sshpass

echo "=== 2. 关闭 SELinux 和防火墙 ==="
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld

echo "=== 3. 安装 Ansible ==="
dnf install -y ansible

echo "=== 4. 生成 SSH 密钥 ==="
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''

echo "=== 5. 配置 ansible.cfg ==="
cat > /etc/ansible/ansible.cfg <<EOF
[defaults]
host_key_checking = False
inventory = /etc/ansible/hosts
remote_user = root
timeout = 30
log_path = /var/log/ansible.log
EOF

echo "=== 6. 配置 hosts(请自行修改 IP) ==="
cat > /etc/ansible/hosts <<EOF
[web]
192.168.1.101
192.168.1.102

[db]
192.168.1.103
EOF

echo "=== 控制节点准备完成! ==="
echo "请手动执行: ssh-copy-id root@<IP> 或使用 sshpass 批量分发公钥。"

九、生产环境建议

  1. 使用普通用户代替 root

    • 创建 ansible 用户并配置 sudo 免密,然后在 ansible.cfg 中设置 remote_user = ansible,Playbook 中 become: yes
  2. 保留 SELinux 和防火墙

    • 只开放必要端口,并编写 SELinux 策略,而非直接禁用。
  3. 使用 Ansible Vault 管理密码

    • 避免明文密码出现在脚本或历史中。
  4. 定期更新 Ansible 版本

    • 关注安全漏洞和功能更新。
  5. 将 inventory 文件纳入版本控制

    • 便于团队协作和变更追踪。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐