ansible批量管理linux需三步:免密ssh(检查sshd_config、权限及认证方式)、正确inventory(避免路径/缩进/参数错误)和选对模块(command受限但安全,shell支持管道但有注入风险)。

Ansible 能批量管理 Linux 服务器,但不是装完就能用——免密 SSH、正确 inventory、模块选对这三步卡住 90% 新手。
免密登录失败时,ssh-copy-id 报错 Permission denied 的真实原因
这不是 Ansible 的问题,而是 SSH 认证链断在了第一步。常见现象:执行 ansible all -i hosts -m ping 时卡住几秒后报 UNREACHABLE!,或直接提示 Permission denied (publickey)。
- 目标机
/etc/ssh/sshd_config中PubkeyAuthentication yes必须开启,且AuthorizedKeysFile指向默认位置(通常是.ssh/authorized_keys) -
ssh-copy-id默认用当前用户推公钥,但目标机上该用户家目录的.ssh权限必须是700,authorized_keys必须是600;否则 sshd 会静默拒绝 - 如果目标机禁用了密码登录,又没开 pubkey 认证,
ssh-copy-id就会失败——它底层依赖密码登录来写文件 - 临时验证方法:
ssh -o ConnectTimeout=5 -o BatchMode=yes user@host,不加密钥也能快速判断连通性和认证方式是否生效
ansible 命令里 -m command 和 -m shell 到底该用哪个
区别不在“能不能执行命令”,而在“环境变量、管道、重定向是否可用”。command 是最安全的默认模块,但也是最受限的。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
command:不走 shell 解释器,所以ls /tmp | grep log、cd /var && pwd、export FOO=bar全部失效;适合简单命令如uptime、df -h -
shell:调用远程主机的/bin/sh(或ansible_shell_type指定的 shell),支持管道、重定向、环境变量;但要注意 shell 注入风险,尤其拼接变量时 - 真正需要执行脚本逻辑时,优先用
script模块(本地脚本自动传过去执行),而不是把多行命令塞进shell的-a参数里 - 查看远程主机 PATH 是否一致?用
ansible web -m command -a "echo $PATH"会输出空——改用-m shell才能生效
写 playbook 时 when 判断系统类型,别只看 ansible_distribution
硬编码 Ubuntu 或 CentOS 容易翻车,因为 ansible_distribution 在较新版本中已弃用,且不同发行版返回值不统一(比如 Rocky Linux 返回 Rocky,AlmaLinux 返回 AlmaLinux)。
- 推荐用
ansible_facts['os_family']:值固定为Debian、RedHat、Suse等,覆盖主流分支 - 若需精确到发行版+版本号,用
ansible_facts['distribution_major_version']配合os_family,例如when: ansible_facts['os_family'] == "RedHat" and ansible_facts['distribution_major_version'] | int >= 8 - 注意:playbook 中未显式写
gather_facts: true时,ansible_facts可能为空——这是默认行为,但很多新手以为它总可用 - 调试事实变量:加一个临时 task
- name: debug facts debug: var=ansible_facts,运行时加-v看输出
inventory 文件里路径写错、YAML 缩进多一个空格、模块参数名拼错成 stae 而不是 state——这些错误不会报语法异常,而是让任务静默跳过或执行出错。建议每次写完 playbook 先跑 ansible-playbook --syntax-check deploy.yml,再用 --check --diff 预演变更。真正上线前,永远先在单台机器上加 --limit target_host 测试。










