Ansible Cheatsheet - Automation

自动化运维必备的 Ansible 命令都在这里了,从 ad-hoc 到 Playbook,按场景分类整理,快速上手自动化。

SysOps·42 commands·Last updated 2026-07-21
Back to SysOps

核心命令 6

ansible all -m ping
测试所有主机连通性
ansible-playbook site.yml
执行 Playbook
ansible-galaxy init myrole
初始化角色目录结构
ansible-galaxy install geerlingguy.nginx
从 Galaxy 安装角色
ansible-vault encrypt secrets.yml
加密敏感变量文件
ansible-doc -l | grep copy
列出模块并搜索用法

ad-hoc 命令 7

ansible webservers -m shell -a "uptime"
在指定组执行 shell 命令
ansible all -m setup -a "filter=ansible_os_family"
收集主机 facts 信息
ansible all -m copy -a "src=file.txt dest=/tmp/"
复制文件到远程主机
ansible all -m service -a "name=nginx state=started"
启动服务
ansible webservers -m yum -a "name=nginx state=latest"
安装或升级软件包
ansible all -m ping --limit web1
只对匹配的主机执行
ansible all -m shell -a "df -h" -f 10
设置并行 fork 数量加速执行

常用模块 7

- name: Install nginx\n apt:\n name: nginx\n state: present
apt/yum 包管理模块
- name: Copy config\n template:\n src: nginx.conf.j2\n dest: /etc/nginx/nginx.conf
template 模板渲染模块
- name: Start service\n service:\n name: nginx\n state: started\n enabled: yes
service 服务管理模块
- name: Create user\n user:\n name: deploy\n shell: /bin/bash
user 用户管理模块
- name: Run command\n shell: npm run build\n args:\n chdir: /app
shell 命令执行模块
- name: Create dir\n file:\n path: /opt/app\n state: directory\n mode: "0755"
file 文件/目录管理模块
- name: Git clone\n git:\n repo: https://github.com/x/y.git\n dest: /srv/app
git 代码检出模块

Playbook 结构 6

- hosts: webservers\n become: yes\n tasks: [...]
指定目标主机并启用 sudo
pre_tasks: / post_tasks:
在 roles 前后执行的任务
handlers:\n - name: restart nginx\n service: name=nginx state=restarted
定义 handler,被 notify 触发
vars:\n nginx_port: 80
在 Playbook 中内联变量
- name: notify handler\n template: ...\n notify: restart nginx
任务变更后通知 handler 执行
- import_playbook: db.yml
引入其他 Playbook

变量与模板 6

vars_files:\n - vars/secrets.yml
从文件加载变量
- command: ...\n when: ansible_os_family == "Debian"
条件执行,支持 Jinja2 表达式
- user: name={{ item }}\n with_items:\n - alice\n - bob
循环遍历列表
- command: ...\n register: result
将任务输出注册到变量
{{ nginx_port }} / {{ ansible_hostname }}
Jinja2 模板语法引用变量
when: result.rc == 0
基于上一任务返回值做条件判断

Inventory 管理 5

[webservers]\nweb1 ansible_host=10.0.1.1\nweb2 ansible_host=10.0.1.2
INI 格式 Inventory
[web:children]\nweb1\nweb2
定义组嵌套关系
ansible all -i hosts.yml --list-hosts
指定 Inventory 并列出匹配主机
ansible all -i ec2.py --list-hosts
使用动态 Inventory(云平台)
web1 ansible_host=10.0.1.1 ansible_user=deploy ansible_port=2222
为主机指定连接参数

角色与最佳实践 5

ansible-galaxy init myrole
生成标准角色目录结构
roles/myrole/{tasks,handlers,templates,files,defaults,vars}/main.yml
角色标准目录约定
- hosts: web\n roles:\n - nginx\n - { role: db, when: enable_db }
在 Playbook 中使用角色
- import_role:\n name: nginx\n tags: setup
静态引入角色并打标签
[defaults]\ninventory = hosts\nremote_user = deploy\nhost_key_checking = False
ansible.cfg 全局配置

💡 Tips

  • Ansible 默认使用 SSH 连接,无需在目标机器安装 Agent。
  • template 模块用 Jinja2 语法渲染配置文件,比 copy 更灵活。
  • --check 模式(dry-run)可以预览 Playbook 执行效果而不实际修改系统。
  • roles 目录结构:tasks/main.yml、handlers/main.yml、templates/、files/、defaults/main.yml。
  • 敏感数据用 ansible-vault 加密,配合 vars_files 引入,不要硬编码进 Playbook。
  • group_vars/ 和 host_vars/ 目录可按组和主机自动加载变量,比内联更易维护。