openEuler22.03搭建Ansible
·
📘 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 批量分发公钥。"
九、生产环境建议
-
使用普通用户代替 root
- 创建
ansible用户并配置sudo免密,然后在ansible.cfg中设置remote_user = ansible,Playbook 中become: yes。
- 创建
-
保留 SELinux 和防火墙
- 只开放必要端口,并编写 SELinux 策略,而非直接禁用。
-
使用 Ansible Vault 管理密码
- 避免明文密码出现在脚本或历史中。
-
定期更新 Ansible 版本
- 关注安全漏洞和功能更新。
-
将 inventory 文件纳入版本控制
- 便于团队协作和变更追踪。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)