GitHub

快速上手

三个文件、三条命令,完成第一次部署。

1. 编写主机清单 inventory.yml

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

认证顺序:passwordkey_file → ssh-agent → ~/.ssh/id_{ed25519,ecdsa,rsa}。主机密钥按 known_hosts 校验,首次连接自动记录(accept-new), 不匹配则拒绝连接。

2. 编写 playbook(site.yml)

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 是安全的。