适用场景:运维自动化工程师、DevOps实践者
文章主旨:从Playbook高级特性、Roles组织、变量与模板、加密与Ansible Vault,到插件开发和API调用,全面掌握Ansible在企业级环境中的应用。
自动化运维进阶:使用Ansible实现Linux服务器配置管理
Ansible作为无代理的自动化工具,以其简单、易用和强大在运维领域占据主导地位。本文面向已经掌握基础Playbook语法的读者,深入探讨Ansible的高级特性,包括Roles设计模式、变量优先级、Jinja2模板、加密管理、插件开发以及与CI/CD的集成。
一、Ansible Roles与目录结构最佳实践
1.1 Roles标准化结构
Roles是组织Playbook的最佳方式,推荐目录结构如下:
roles/
common/
tasks/
main.yml
handlers/
main.yml
templates/
files/
vars/
main.yml
defaults/
main.yml
meta/
main.yml
webserver/
...
1.2 使用ansible-galaxy初始化Role
ansible-galaxy init webserver
1.3 Role依赖
在meta/main.yml中定义依赖:
dependencies:
- role: common
vars:
common_package: curl
二、变量优先级与覆盖规则
Ansible变量有19种定义方式,理解优先级至关重要(从低到高):
-
命令行 -e(最高优先级)
-
主机清单变量(host_vars)
-
Playbook中vars
-
Role defaults(最低)
调试变量:
ansible-inventory --host target --list
ansible -m debug -a "var=hostvars[inventory_hostname]" target
三、Jinja2模板高级用法
3.1 模板结构
{% for user in users %}
{{ user.name }}:{{ user.uid }}:{{ user.group }}
{% endfor %}
3.2 过滤器(Filters)
示例:
- name: 生成JSON配置
template:
src: app.conf.j2
dest: /etc/app.conf
vars:
config: "{{ lookup('file', 'config.json') | from_json }}"
3.3 查找插件(Lookup Plugins)
-
lookup('file', '/etc/hosts')
-
lookup('env','HOME')
-
lookup('pipe','date')
-
lookup('password','/dev/null length=10') 生成随机密码
四、Ansible Vault:加密敏感数据
4.1 加密文件
ansible-vault create secrets.yml
ansible-vault encrypt existing.yml
ansible-vault view secrets.yml
4.2 使用密码文件
ansible-playbook playbook.yml --vault-password-file vault.pass
4.3 多密码管理
Ansible 2.4+支持多个vault ID:
ansible-vault create --vault-id prod@prompt secrets_prod.yml
ansible-playbook --vault-id prod@.vault_pass_prod playbook.yml
五、高级任务控制
5.1 委派(delegate_to)
将任务在另一台主机执行:
- name: 在负载均衡器上添加后端
haproxy:
state: enabled
host: "{{ inventory_hostname }}"
backend: app
delegate_to: "{{ lb_host }}"
5.2 滚动更新与批处理(serial)
- hosts: webservers
serial: "20%"
tasks:
- name: 更新服务
service: name=httpd state=restarted
5.3 失败处理
- name: 可能失败的任务
command: /bin/false
ignore_errors: yes
- name: 失败后继续
command: /bin/true
failed_when: false
- name: 设置救援任务
block:
- command: /bin/false
rescue:
- debug: msg="任务失败,执行恢复"
always:
- debug: msg="总是执行"
六、动态Inventory与插件开发
6.1 动态Inventory脚本
支持从云平台(AWS、OpenStack)动态获取主机列表。示例(AWS EC2):
ansible-inventory -i aws_ec2.yml --list
配置文件aws_ec2.yml:
plugin: aws_ec2
regions:
- us-east-1
filters:
tag:Environment: production
6.2 自定义模块开发
用Python编写简单模块:
from ansible.module_utils.basic import AnsibleModule
def main():
module = AnsibleModule(
argument_spec=dict(
name=dict(type='str', required=True),
)
)
name = module.params['name']
result = dict(changed=False, message=f"Hello {name}")
module.exit_json(**result)
if __name__ == '__main__':
main()
七、Ansible与CI/CD集成
7.1 GitLab CI 示例
stages:
- deploy
deploy_prod:
stage: deploy
script:
- ansible-playbook -i inventory/prod deploy.yml --vault-password-file $VAULT_PASS
only:
- master
7.2 AWX/Tower 使用
AWX是Ansible的开源Web UI,支持权限控制、作业调度和REST API。
八、性能优化
-
开启SSH pipelining:减少SSH连接次数
-
使用Mitogen加速:Mitogen插件能大幅提升执行速度
-
事实缓存:gathering = smart 或 fact_caching = redis
[defaults]
gathering = smart
fact_caching = redis
fact_caching_timeout = 86400
九、总结
Ansible的强大不仅在于其简单入门,更在于其深度的可扩展性。通过Roles组织、变量控制、模板渲染、加密管理以及自定义插件,可以将基础设施代码化(IaC)提升到新高度,实现高效、可靠的自动化运维。
暂无评论