Ansible Playbook

清单(Inventory)

# inventory/hosts.ini [webservers] web1.example.com web2.example.com ansible_user=ubuntu [dbservers] db1.example.com ansible_host=10.0.1.10 [production:children] webservers dbservers [production:vars] ansible_user=deploy # 运行命令 ansible -i inventory/hosts.ini webservers -m ping ansible-playbook -i inventory/hosts.ini deploy.yml

Playbook 结构

--- - name: 部署 Web 应用 hosts: webservers become: yes serial: 2 # 滚动更新:每次 2 台 vars: app_version: "2.1.0" app_dir: /opt/myapp vars_files: - vars/common.yml tasks: - name: 创建应用目录 file: path: "{{app_dir}}" state: directory mode: '0755' - name: 部署应用 copy: src: dist/ dest: "{{app_dir}}/" notify: Restart nginx handlers: - name: Restart nginx service: name: nginx state: restarted

任务与模块

tasks: # 包管理 - name: 安装软件包 package: name: "{{item}}" state: present loop: [nginx, git, python3-pip] # 模板文件 - name: 部署 Nginx 配置 template: src: templates/nginx.conf.j2 dest: /etc/nginx/nginx.conf validate: nginx -t -c %s notify: Reload nginx # 注册命令输出 - name: 获取当前版本 command: /opt/myapp/bin/version register: current_version changed_when: false

变量与条件

# 条件判断 - name: 在 RHEL 上安装 Apache yum: name: httpd state: present when: ansible_os_family == "RedHat" # 循环 - name: 创建用户 user: name: "{{item.name}}" groups: "{{item.groups}}" loop: - { name: alice, groups: sudo } - { name: bob, groups: developers }

Ansible Vault

# 加密文件 ansible-vault encrypt vars/secrets.yml # 编辑加密文件 ansible-vault edit vars/secrets.yml # 使用 vault 密码运行 Playbook ansible-playbook deploy.yml --ask-vault-pass ansible-playbook deploy.yml --vault-password-file ~/.vault_pass