活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

Ansible Playbook语法速查表 掌握自动化配置的核心技巧

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-5 14:00:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. Ansible Playbook基础介绍

Ansible Playbook是Ansible的核心组件,它是一种使用YAML语言编写的配置、部署和编排文件。Playbook允许您描述IT应用基础设施的自动化策略,使复杂的配置管理任务变得简单易行。

Playbook的优势在于:

• 人类可读:使用YAML格式,语法简洁明了
• 幂等性:多次执行相同任务不会改变结果(除非需要改变)
• 高效性:可以并行执行多个任务
• 可扩展性:支持模块化设计,可以通过角色和包含来组织复杂任务

2. YAML语法基础

Ansible Playbook使用YAML(YAML Ain’t Markup Language)语言编写。了解YAML的基本语法对于编写Playbook至关重要。

2.1 基本语法规则
  1. # 键值对
  2. key: value
  3. # 列表(使用连字符开头)
  4. - item1
  5. - item2
  6. - item3
  7. # 嵌套结构
  8. key:
  9.   nested_key1: value1
  10.   nested_key2: value2
  11. # 列表中的字典
  12. - name: item1
  13.   value: value1
  14. - name: item2
  15.   value: value2
复制代码

2.2 YAML中的数据类型
  1. # 字符串
  2. string_var: "This is a string"
  3. another_string: 'This is also a string'
  4. # 数字
  5. integer_var: 42
  6. float_var: 3.14
  7. # 布尔值
  8. boolean_true: yes
  9. boolean_false: no
  10. # null值
  11. null_var: null
复制代码

2.3 YAML中的注释

在YAML中,使用#符号表示注释:
  1. # 这是一个注释
  2. key: value  # 这也是一个行内注释
复制代码

3. Playbook基本结构

一个基本的Ansible Playbook由一个或多个”play”组成,每个play定义了一组要在特定主机或主机组上执行的任务。

3.1 最简单的Playbook结构
  1. ---
  2. - name: Playbook名称
  3.   hosts: 目标主机或主机组
  4.   tasks:
  5.     - name: 任务1名称
  6.       module_name:
  7.         parameter1: value1
  8.         parameter2: value2
  9.    
  10.     - name: 任务2名称
  11.       module_name:
  12.         parameter1: value1
复制代码

3.2 完整的Playbook结构
  1. ---
  2. - name: 第一个play
  3.   hosts: webservers
  4.   become: yes
  5.   vars:
  6.     http_port: 80
  7.     max_clients: 200
  8.   
  9.   vars_files:
  10.     - vars/external_vars.yml
  11.   
  12.   pre_tasks:
  13.     - name: 预任务1
  14.       debug:
  15.         msg: "开始执行预任务"
  16.   
  17.   roles:
  18.     - common
  19.     - webserver
  20.   
  21.   tasks:
  22.     - name: 安装Apache
  23.       yum:
  24.         name: httpd
  25.         state: present
  26.    
  27.     - name: 启动Apache服务
  28.       service:
  29.         name: httpd
  30.         state: started
  31.         enabled: yes
  32.   
  33.   post_tasks:
  34.     - name: 后任务1
  35.       debug:
  36.         msg: "所有任务执行完成"
  37.   
  38.   handlers:
  39.     - name: 重启Apache
  40.       service:
  41.         name: httpd
  42.         state: restarted
复制代码

4. 常用模块详解

Ansible提供了大量模块来执行各种任务。以下是一些最常用的模块及其用法。

4.1 文件和目录操作模块
  1. - name: 复制文件到远程主机
  2.   copy:
  3.     src: /path/to/local/file
  4.     dest: /path/to/remote/file
  5.     owner: root
  6.     group: root
  7.     mode: '0644'
  8.     backup: yes
复制代码
  1. - name: 创建目录
  2.   file:
  3.     path: /path/to/directory
  4.     state: directory
  5.     owner: root
  6.     group: root
  7.     mode: '0755'
  8. - name: 创建符号链接
  9.   file:
  10.     src: /path/to/source
  11.     dest: /path/to/link
  12.     state: link
  13. - name: 删除文件
  14.   file:
  15.     path: /path/to/file
  16.     state: absent
复制代码
  1. - name: 检查文件状态
  2.   stat:
  3.     path: /path/to/file
  4.   register: file_stat
  5. - name: 显示文件信息
  6.   debug:
  7.     msg: "文件大小: {{ file_stat.stat.size }} 字节"
  8.   when: file_stat.stat.exists
复制代码

4.2 软件包管理模块
  1. - name: 安装最新版本的Apache
  2.   yum:
  3.     name: httpd
  4.     state: latest
  5. - name: 安装多个软件包
  6.   yum:
  7.     name:
  8.       - httpd
  9.       - httpd-tools
  10.       - mod_ssl
  11.     state: present
  12. - name: 移除软件包
  13.   yum:
  14.     name: httpd
  15.     state: absent
复制代码
  1. - name: 更新apt缓存并安装Nginx
  2.   apt:
  3.     name: nginx
  4.     state: latest
  5.     update_cache: yes
  6. - name: 安装特定版本的软件包
  7.   apt:
  8.     name: nginx=1.18.0-0ubuntu1
  9.     state: present
  10. - name: 卸载软件包并删除配置文件
  11.   apt:
  12.     name: nginx
  13.     state: absent
  14.     purge: yes
复制代码

4.3 服务管理模块
  1. - name: 启动并启用Apache服务
  2.   service:
  3.     name: httpd
  4.     state: started
  5.     enabled: yes
  6. - name: 重启服务
  7.   service:
  8.     name: httpd
  9.     state: restarted
  10. - name: 停止服务
  11.   service:
  12.     name: httpd
  13.     state: stopped
复制代码

4.4 用户和组管理模块
  1. - name: 创建用户
  2.   user:
  3.     name: johndoe
  4.     comment: "John Doe"
  5.     uid: 1040
  6.     group: users
  7.     shell: /bin/bash
  8.     password: "{{ 'password' | password_hash('sha512') }}"
  9. - name: 创建组
  10.   group:
  11.     name: developers
  12.     state: present
  13.     gid: 1050
  14. - name: 生成SSH密钥
  15.   user:
  16.     name: johndoe
  17.     generate_ssh_key: yes
  18.     ssh_key_bits: 2048
  19.     ssh_key_file: .ssh/id_rsa
复制代码

4.5 系统信息模块
  1. - name: 收集系统信息
  2.   setup:
  3.   register: system_info
  4. - name: 显示操作系统信息
  5.   debug:
  6.     msg: "系统: {{ system_info.ansible_distribution }} {{ system_info.ansible_distribution_version }}"
复制代码

4.6 命令和脚本执行模块
  1. - name: 检查磁盘空间
  2.   command: df -h
  3.   register: disk_space
  4. - name: 显示磁盘使用情况
  5.   debug:
  6.     msg: "{{ disk_space.stdout_lines }}"
复制代码
  1. - name: 执行带有管道的命令
  2.   shell: ps aux | grep httpd
  3.   register: httpd_processes
  4. - name: 显示Apache进程
  5.   debug:
  6.     msg: "{{ httpd_processes.stdout_lines }}"
复制代码
  1. - name: 在远程主机上执行本地脚本
  2.   script: /path/to/local/script.sh --parameter1 value1
复制代码

5. 变量使用

变量是Ansible Playbook中的重要组成部分,它们使Playbook更加灵活和可重用。

5.1 定义变量
  1. ---
  2. - name: 使用变量示例
  3.   hosts: webservers
  4.   vars:
  5.     package_name: httpd
  6.     service_name: httpd
  7.     config_file: /etc/httpd/conf/httpd.conf
  8.   
  9.   tasks:
  10.     - name: 安装{{ package_name }}
  11.       yum:
  12.         name: "{{ package_name }}"
  13.         state: present
  14.    
  15.     - name: 启动{{ service_name }}服务
  16.       service:
  17.         name: "{{ service_name }}"
  18.         state: started
复制代码
  1. # vars/webserver.yml
  2. package_name: httpd
  3. service_name: httpd
  4. config_file: /etc/httpd/conf/httpd.conf
复制代码

然后在Playbook中引用:
  1. ---
  2. - name: 使用外部变量文件
  3.   hosts: webservers
  4.   vars_files:
  5.     - vars/webserver.yml
  6.   
  7.   tasks:
  8.     - name: 安装{{ package_name }}
  9.       yum:
  10.         name: "{{ package_name }}"
  11.         state: present
复制代码

5.2 变量类型
  1. vars:
  2.   app_name: "my_web_app"
  3.   app_version: "1.2.3"
复制代码
  1. vars:
  2.   http_port: 80
  3.   https_port: 443
  4.   max_connections: 1000
复制代码
  1. vars:
  2.   required_packages:
  3.     - httpd
  4.     - php
  5.     - mysql
  6.     - php-mysql
复制代码
  1. vars:
  2.   database_config:
  3.     host: localhost
  4.     port: 3306
  5.     name: webapp_db
  6.     user: webapp_user
  7.     password: secure_password
复制代码

5.3 使用变量
  1. tasks:
  2.   - name: 创建目录
  3.     file:
  4.       path: "/var/www/{{ app_name }}"
  5.       state: directory
复制代码
  1. tasks:
  2.   - name: 创建配置文件
  3.     template:
  4.       src: config.j2
  5.       dest: "/etc/app/config.ini"
  6.     vars:
  7.       db_host: "{{ database_config.host }}"
  8.       db_port: "{{ database_config.port }}"
复制代码
  1. tasks:
  2.   - name: 安装多个软件包
  3.     yum:
  4.       name: "{{ required_packages }}"
  5.       state: present
复制代码

5.4 变量优先级

Ansible中变量的优先级顺序(从高到低):

1. 命令行中通过-e或--extra-vars指定的变量
2. 在inventory中定义的连接变量
3. 在play中定义的vars
4. 在play中通过vars_files包含的变量
5. 在role中定义的vars
6. 在inventory中定义的变量
7. 通过set_fact模块设置的变量
8. 角色默认值(defaults/main.yml)

5.5 注册变量

使用register关键字可以将任务的输出保存到变量中,以便在后续任务中使用。
  1. - name: 检查服务状态
  2.   command: systemctl status nginx
  3.   register: nginx_status
  4.   ignore_errors: yes
  5. - name: 显示服务状态
  6.   debug:
  7.     msg: "Nginx服务状态: {{ nginx_status.rc }}"
  8.   when: nginx_status.rc is defined
  9. - name: 重启服务(如果失败)
  10.   service:
  11.     name: nginx
  12.     state: restarted
  13.   when: nginx_status.rc != 0
复制代码

6. 条件判断和循环

条件判断和循环是Ansible Playbook中控制任务执行流程的重要机制。

6.1 条件判断
  1. - name: 安装Apache(仅适用于CentOS系统)
  2.   yum:
  3.     name: httpd
  4.     state: present
  5.   when: ansible_distribution == "CentOS"
  6. - name: 安装Nginx(仅适用于Ubuntu系统)
  7.   apt:
  8.     name: nginx
  9.     state: present
  10.   when: ansible_distribution == "Ubuntu"
复制代码
  1. - name: 安装特定版本的软件包(仅适用于CentOS 7)
  2.   yum:
  3.     name: httpd-2.4.6
  4.     state: present
  5.   when:
  6.     - ansible_distribution == "CentOS"
  7.     - ansible_distribution_major_version == "7"
复制代码
  1. - name: 安装开发工具
  2.   yum:
  3.     name: "@Development tools"
  4.     state: present
  5.   when:
  6.     - (ansible_distribution == "CentOS" or ansible_distribution == "Red Hat Enterprise Linux")
  7.     - ansible_distribution_major_version|int >= 7
复制代码
  1. - name: 使用自定义配置文件(如果存在)
  2.   copy:
  3.     src: "{{ custom_config_file | default('/etc/app/default.conf') }}"
  4.     dest: /etc/app/config.conf
复制代码

6.2 循环
  1. - name: 创建多个用户
  2.   user:
  3.     name: "{{ item }}"
  4.     state: present
  5.   loop:
  6.     - alice
  7.     - bob
  8.     - charlie
复制代码
  1. - name: 创建多个用户并设置属性
  2.   user:
  3.     name: "{{ item.name }}"
  4.     uid: "{{ item.uid }}"
  5.     group: "{{ item.group }}"
  6.     shell: "{{ item.shell }}"
  7.   loop:
  8.     - { name: 'alice', uid: 1001, group: 'users', shell: '/bin/bash' }
  9.     - { name: 'bob', uid: 1002, group: 'developers', shell: '/bin/zsh' }
  10.     - { name: 'charlie', uid: 1003, group: 'admins', shell: '/bin/bash' }
复制代码
  1. - name: 安装多个软件包
  2.   yum:
  3.     name: "{{ item }}"
  4.     state: present
  5.   with_items:
  6.     - httpd
  7.     - php
  8.     - php-mysql
  9.     - php-gd
复制代码
  1. - name: 打印字典键值对
  2.   debug:
  3.     msg: "Key: {{ item.key }}, Value: {{ item.value }}"
  4.   with_dict:
  5.     - { key: 'name', value: 'John' }
  6.     - { key: 'age', value: 30 }
  7.     - { key: 'city', value: 'New York' }
复制代码
  1. - name: 复制所有配置文件
  2.   copy:
  3.     src: "{{ item }}"
  4.     dest: "/etc/app/{{ item | basename }}"
  5.   with_fileglob:
  6.     - "files/*.conf"
复制代码
  1. - name: 创建多个目录
  2.   file:
  3.     path: "/tmp/dir{{ item }}"
  4.     state: directory
  5.   with_sequence: start=1 end=5
复制代码
  1. - name: 等待服务启动
  2.   command: systemctl status nginx
  3.   register: nginx_status
  4.   until: nginx_status.rc == 0
  5.   retries: 5
  6.   delay: 10
复制代码

7. 模板和文件操作

7.1 使用template模块

template模块允许您使用Jinja2模板引擎生成动态配置文件。
  1. - name: 生成Apache配置文件
  2.   template:
  3.     src: templates/httpd.conf.j2
  4.     dest: /etc/httpd/conf/httpd.conf
  5.     owner: root
  6.     group: root
  7.     mode: '0644'
  8.     backup: yes
  9.   notify: 重启Apache
复制代码
  1. # {{ ansible_managed }}
  2. ServerRoot "/etc/httpd"
  3. Listen {{ http_port }}
  4. User apache
  5. Group apache
  6. ServerAdmin {{ server_admin }}
  7. ServerName {{ server_name }}
  8. DocumentRoot "/var/www/html"
  9. <Directory "/var/www/html">
  10.     Options Indexes FollowSymLinks
  11.     AllowOverride None
  12.     Require all granted
  13. </Directory>
  14. {% if enable_ssl %}
  15. LoadModule ssl_module modules/mod_ssl.so
  16. Listen {{ https_port }}
  17. <VirtualHost *:{{ https_port }}>
  18.     SSLEngine on
  19.     SSLCertificateFile {{ ssl_cert_file }}
  20.     SSLCertificateKeyFile {{ ssl_key_file }}
  21. </VirtualHost>
  22. {% endif %}
复制代码

7.2 Jinja2模板高级用法
  1. {% if ansible_distribution == "CentOS" %}
  2. # CentOS specific configuration
  3. SyslogFacility AUTHPRIV
  4. {% elif ansible_distribution == "Ubuntu" %}
  5. # Ubuntu specific configuration
  6. SyslogFacility AUTH
  7. {% else %}
  8. # Default configuration
  9. SyslogFacility AUTH
  10. {% endif %}
复制代码
  1. # Virtual hosts configuration
  2. {% for vhost in virtual_hosts %}
  3. <VirtualHost *:{{ vhost.port }}>
  4.     ServerName {{ vhost.server_name }}
  5.     DocumentRoot {{ vhost.document_root }}
  6.    
  7.     {% if vhost.custom_log is defined %}
  8.     CustomLog {{ vhost.custom_log }} combined
  9.     {% endif %}
  10.    
  11.     {% if vhost.error_log is defined %}
  12.     ErrorLog {{ vhost.error_log }}
  13.     {% endif %}
  14. </VirtualHost>
  15. {% endfor %}
复制代码
  1. # 使用过滤器
  2. ServerAdmin {{ admin_email | default("admin@example.com") }}
  3. MaxClients {{ max_clients | int }}
  4. ServerName {{ server_name | lower }}
  5. DocumentRoot "{{ document_root | quote }}"
复制代码

7.3 行内文件内容
  1. - name: 在配置文件中添加块
  2.   blockinfile:
  3.     path: /etc/ssh/sshd_config
  4.     block: |
  5.       # Custom SSH settings
  6.       PermitRootLogin no
  7.       PasswordAuthentication no
  8.       AllowUsers {{ allowed_users }}
  9.     marker: "# {mark} ANSIBLE MANAGED BLOCK"
  10.     backup: yes
  11.   notify: 重启SSH服务
复制代码
  1. - name: 确保特定行存在于文件中
  2.   lineinfile:
  3.     path: /etc/selinux/config
  4.     regexp: '^SELINUX='
  5.     line: 'SELINUX=disabled'
  6.     backup: yes
  7.   notify: 重启系统
  8. - name: 删除文件中的特定行
  9.   lineinfile:
  10.     path: /etc/hosts
  11.     regexp: '^192\.168\.1\.100'
  12.     state: absent
复制代码

8. 错误处理

8.1 忽略错误
  1. - name: 尝试删除可能不存在的文件
  2.   file:
  3.     path: /tmp/old_config.conf
  4.     state: absent
  5.   ignore_errors: yes
复制代码

8.2 错误处理与恢复
  1. - name: 尝试执行可能失败的任务
  2.   command: /usr/bin/might_fail
  3.   register: result
  4.   ignore_errors: yes
  5. - name: 执行失败时的恢复操作
  6.   command: /usr/bin/recover_from_failure
  7.   when: result is failed
复制代码

8.3 使用failed_when控制失败条件
  1. - name: 检查磁盘空间
  2.   shell: df / | tail -1 | awk '{print $5}' | sed 's/%//'
  3.   register: disk_usage
  4.   failed_when: disk_usage.stdout|int > 90
  5.   changed_when: false
  6. - name: 显示磁盘使用情况
  7.   debug:
  8.     msg: "磁盘使用率: {{ disk_usage.stdout }}%"
复制代码

8.4 使用rescue和block进行错误处理
  1. - name: 尝试执行一系列任务,并在失败时执行恢复操作
  2.   block:
  3.     - name: 安装软件包
  4.       yum:
  5.         name: "{{ item }}"
  6.         state: present
  7.       loop:
  8.         - package1
  9.         - package2
  10.         - package3
  11.    
  12.     - name: 配置服务
  13.       template:
  14.         src: service.conf.j2
  15.         dest: /etc/service/service.conf
  16.    
  17.     - name: 启动服务
  18.       service:
  19.         name: myservice
  20.         state: started
  21.         enabled: yes
  22.   
  23.   rescue:
  24.     - name: 记录错误
  25.       debug:
  26.         msg: "安装或配置过程中出现错误,执行回滚操作"
  27.    
  28.     - name: 停止服务(如果已启动)
  29.       service:
  30.         name: myservice
  31.         state: stopped
  32.       ignore_errors: yes
  33.    
  34.     - name: 删除配置文件
  35.       file:
  36.         path: /etc/service/service.conf
  37.         state: absent
  38.       ignore_errors: yes
  39.    
  40.     - name: 卸载软件包
  41.       yum:
  42.         name: "{{ item }}"
  43.         state: absent
  44.       loop:
  45.         - package1
  46.         - package2
  47.         - package3
  48.       ignore_errors: yes
  49.   
  50.   always:
  51.     - name: 发送通知
  52.       debug:
  53.         msg: "任务执行完成,无论成功或失败"
复制代码

9. 角色和包含

9.1 使用include和import
  1. - name: 包含任务列表
  2.   include_tasks: tasks/setup.yml
  3.   vars:
  4.     package_name: httpd
  5. - name: 条件包含任务
  6.   include_tasks: "tasks/{{ ansible_os_family }}.yml"
复制代码
  1. - name: 导入任务列表
  2.   import_tasks: tasks/common.yml
  3. - name: 条件导入任务(在解析时评估)
  4.   import_tasks: tasks/firewall.yml
  5.   when: enable_firewall | bool
复制代码
  1. - name: 包含角色
  2.   include_role:
  3.     name: common
  4.     tasks_from: main.yml
  5.     vars_from: main.yml
  6.     defaults_from: main.yml
  7. - name: 导入角色
  8.   import_role:
  9.     name: webserver
复制代码

9.2 创建和使用角色
  1. site.yml
  2. webservers.yml
  3. fooservers.yml
  4. roles/
  5.     common/
  6.         tasks/
  7.         handlers/
  8.         files/
  9.         templates/
  10.         vars/
  11.         defaults/
  12.         meta/
  13.     webservers/
  14.         tasks/
  15.         defaults/
  16.         meta/
复制代码
  1. ---
  2. - name: 安装Web服务器软件包
  3.   package:
  4.     name: "{{ web_server_package }}"
  5.     state: present
  6. - name: 创建Web服务器配置目录
  7.   file:
  8.     path: "{{ web_server_config_dir }}"
  9.     state: directory
  10.     owner: root
  11.     group: root
  12.     mode: '0755'
  13. - name: 生成Web服务器配置文件
  14.   template:
  15.     src: webserver.conf.j2
  16.     dest: "{{ web_server_config_path }}"
  17.     owner: root
  18.     group: root
  19.     mode: '0644'
  20.   notify: 重启Web服务器
  21. - name: 确保Web服务器正在运行
  22.   service:
  23.     name: "{{ web_server_service }}"
  24.     state: started
  25.     enabled: yes
复制代码
  1. ---
  2. # 默认变量
  3. web_server_package: apache2
  4. web_server_service: apache2
  5. web_server_config_dir: /etc/apache2
  6. web_server_config_path: /etc/apache2/apache2.conf
  7. web_server_port: 80
  8. web_server_user: www-data
  9. web_server_group: www-data
复制代码
  1. ---
  2. - name: 重启Web服务器
  3.   service:
  4.     name: "{{ web_server_service }}"
  5.     state: restarted
  6. - name: 重新加载Web服务器
  7.   service:
  8.     name: "{{ web_server_service }}"
  9.     state: reloaded
复制代码
  1. ---
  2. - name: 配置Web服务器
  3.   hosts: webservers
  4.   become: yes
  5.   
  6.   roles:
  7.     - common
  8.     - { role: webservers, web_server_port: 8080 }
  9.     - { role: firewall, when: enable_firewall | bool }
复制代码

10. 最佳实践

10.1 Playbook结构最佳实践
  1. # 始终在Playbook顶部添加注释,说明用途和作者
  2. ---
  3. # 作者: John Doe
  4. # 描述: 配置Web服务器和数据库服务器
  5. # 版本: 1.0
  6. - name: 配置Web服务器
  7.   hosts: webservers
  8.   # ... 其余内容 ...
复制代码
  1. # 不好的做法
  2. - name: 安装包
  3.   yum:
  4.     name: httpd
  5.     state: present
  6. # 好的做法
  7. - name: 安装Apache Web服务器
  8.   yum:
  9.     name: httpd
  10.     state: present
复制代码
  1. ---
  2. - name: 配置Web服务器
  3.   hosts: webservers
  4.   become: yes
  5.   
  6.   pre_tasks:
  7.     - name: 预检查系统状态
  8.       include_tasks: tasks/pre_check.yml
  9.   
  10.   roles:
  11.     - common
  12.     - webserver
  13.   
  14.   tasks:
  15.     - name: 部署应用程序
  16.       include_tasks: tasks/deploy_app.yml
  17.   
  18.   post_tasks:
  19.     - name: 验证部署
  20.       include_tasks: tasks/verify_deployment.yml
复制代码

10.2 变量管理最佳实践
  1. # 不好的做法
  2. - name: 配置数据库连接
  3.   template:
  4.     src: database.conf.j2
  5.     dest: /etc/app/database.conf
  6. # 好的做法
  7. - name: 配置数据库连接
  8.   template:
  9.     src: database.conf.j2
  10.     dest: /etc/app/database.conf
  11.   vars:
  12.     db_host: "{{ database_host }}"
  13.     db_port: "{{ database_port }}"
  14.     db_name: "{{ database_name }}"
  15.     db_user: "{{ database_user }}"
  16.     db_pass: "{{ database_password }}"
复制代码
  1. ---
  2. - name: 配置应用程序
  3.   hosts: app_servers
  4.   vars:
  5.     # 全局变量
  6.     app_version: "2.3.1"
  7.   
  8.   tasks:
  9.     - name: 设置应用程序特定变量
  10.       set_fact:
  11.         app_config_dir: "/etc/app-{{ app_version }}"
  12.    
  13.     - name: 创建配置目录
  14.       file:
  15.         path: "{{ app_config_dir }}"
  16.         state: directory
  17.    
  18.     - name: 生成配置文件
  19.       template:
  20.         src: app.conf.j2
  21.         dest: "{{ app_config_dir }}/app.conf"
  22.       vars:
  23.         # 任务级别变量
  24.         debug_mode: "{{ debug_mode_enabled | default(false) }}"
复制代码

10.3 安全最佳实践
  1. # 创建加密的变量文件
  2. ansible-vault create secrets.yml
复制代码
  1. # 在Playbook中使用加密的变量文件
  2. ---
  3. - name: 安全部署应用程序
  4.   hosts: app_servers
  5.   vars_files:
  6.     - secrets.yml
  7.   
  8.   tasks:
  9.     - name: 配置数据库连接
  10.       template:
  11.         src: database.conf.j2
  12.         dest: /etc/app/database.conf
  13.       vars:
  14.         db_host: "{{ database_host }}"
  15.         db_port: "{{ database_port }}"
  16.         db_name: "{{ database_name }}"
  17.         db_user: "{{ database_user }}"
  18.         db_pass: "{{ database_password }}"  # 此值来自加密的secrets.yml
复制代码
  1. # 不好的做法
  2. ansible-playbook deploy.yml --extra-vars "db_password=secret123"
  3. # 好的做法
  4. ansible-playbook deploy.yml --ask-vault-pass
复制代码

10.4 性能优化最佳实践
  1. # ansible.cfg
  2. [defaults]
  3. gathering = smart
  4. fact_caching = jsonfile
  5. fact_caching_connection = /tmp/ansible_facts_cache
  6. fact_caching_timeout = 86400
复制代码
  1. - name: 执行长时间运行的任务
  2.   command: /usr/bin/long_running_operation
  3.   async: 3600
  4.   poll: 0
  5.   register: long_operation_result
  6. - name: 等待长时间运行的任务完成
  7.   async_status:
  8.     jid: "{{ long_operation_result.ansible_job_id }}"
  9.   register: job_result
  10.   until: job_result.finished
  11.   retries: 300
  12.   delay: 10
复制代码
  1. ---
  2. - name: 在多台主机上并行执行任务
  3.   hosts: webservers
  4.   strategy: free
  5.   
  6.   tasks:
  7.     - name: 更新所有软件包
  8.       yum:
  9.         name: "*"
  10.         state: latest
复制代码

10.5 调试和测试最佳实践
  1. ansible-playbook deploy.yml --check
复制代码
  1. ansible-playbook deploy.yml --check --diff
复制代码
  1. - name: 调试变量值
  2.   debug:
  3.     msg: "数据库主机: {{ database_host }}, 端口: {{ database_port }}"
  4. - name: 调试复杂变量结构
  5.   debug:
  6.     var: database_config
复制代码
  1. - name: 验证服务是否正在运行
  2.   assert:
  3.     that:
  4.       - "'running' in service_status.status"
  5.     success_msg: "服务正在运行"
  6.     fail_msg: "服务未运行"
复制代码

结论

Ansible Playbook是自动化配置管理的强大工具,掌握其语法和核心技巧对于构建高效、可维护的自动化解决方案至关重要。通过本速查表,您可以快速了解和参考Ansible Playbook的主要语法元素和使用方法,从基础结构到高级技巧,包括变量使用、条件判断、循环、模板、错误处理、角色和最佳实践等方面。

随着您对Ansible的深入了解,您将能够构建更加复杂和强大的自动化解决方案,提高IT基础设施的效率和可靠性。记住,实践是掌握Ansible Playbook的最佳方式,不断尝试和应用这些技巧将帮助您成为Ansible自动化专家。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则