快速上手
三个文件、三条命令,完成第一次部署。
1. 编写主机清单 inventory.yml
vars: # 全局变量
app_root: /opt/demo-app
hosts:
web1:
addr: 192.168.1.10 # 缺省为主机名本身
port: 22 # 缺省 22
user: deploy # 缺省为当前用户
key_file: ~/.ssh/id_ed25519 # 可选;缺省自动尝试 ssh-agent 和默认密钥
# password: "..." # 可选;建议整个文件用 vault 加密
# become_password: "..." # 可选;sudo 密码
vars:
role: frontend
groups:
web:
hosts: [web1, web2]
vars:
nginx_port: 80认证顺序:password → key_file → ssh-agent → ~/.ssh/id_{ed25519,ecdsa,rsa}。主机密钥按 known_hosts 校验,首次连接自动记录(accept-new), 不匹配则拒绝连接。
2. 编写 playbook(site.yml)
- name: 部署 web 服务
hosts: web # all / 组名 / 主机名,逗号分隔
vars:
release_dir: "{{ app_root }}/releases"
tasks:
- name: 确保发布目录存在
file:
path: "{{ release_dir }}"
state: directory # directory / absent / touch
mode: "0755"
- name: 渲染配置(minijinja / Jinja2 语法)
template:
src: ./nginx.conf.j2
dest: /etc/nginx/nginx.conf
mode: "0644"
become: true
- name: 检查服务
shell: systemctl is-active nginx
register: nginx_status
changed_when: "false"
ignore_errors: true
- name: 未运行时启动
shell: systemctl start nginx
become: true
when: "nginx_status.rc != 0"
- name: 输出
debug:
msg: "{{ inventory_hostname }} => {{ nginx_status.stdout }}"
- name: 拉取远端文件到本地
fetch:
src: /var/log/nginx/error.log
dest: ./logs/ # 目录时自动存为 ./logs/<host>/<文件名>3. 执行
anx run site.yml -i inventory.yml # 执行 playbook
anx run site.yml -l web1 -f 32 -e env=prod # 限定主机、并发 32、额外变量
anx ping -i inventory.yml # 测试连通性
anx exec "uptime" -i inventory.yml -l web -b # 临时命令(-b = sudo)copy / template / file 均为幂等:内容与权限一致时报告 ok,有变更才报告 changed。重复执行同一个 playbook 是安全的。