Ansible Cheatsheet - Automation
自动化运维必备的 Ansible 命令都在这里了,从 ad-hoc 到 Playbook,按场景分类整理,快速上手自动化。
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: presentapt/yum 包管理模块
- name: Copy config\n template:\n src: nginx.conf.j2\n dest: /etc/nginx/nginx.conftemplate 模板渲染模块
- name: Start service\n service:\n name: nginx\n state: started\n enabled: yesservice 服务管理模块
- name: Create user\n user:\n name: deploy\n shell: /bin/bashuser 用户管理模块
- name: Run command\n shell: npm run build\n args:\n chdir: /appshell 命令执行模块
- 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/appgit 代码检出模块
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.2INI 格式 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 = Falseansible.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/ 目录可按组和主机自动加载变量,比内联更易维护。