Ansible-playbook规范¶
问:为什么不把所有的配置都写在一个playbook文件上,而是拆分这么多文件编写?
答:将Ansible配置拆分为多个文件而不是集中在一个Playbook中,主要是为了提升可维护性、可重用性和灵活性。
一、Ansible推荐目录结构¶
这种结构使配置在大规模项目中更具扩展性,也符合社区标准,更容易被新成员理解和使用。
二、解析角色目录结构¶
- handlers:定义了重启Logstash服务的处理器(
main.yml)。 - meta:角色的依赖声明(
main.yml,例如依赖于jdk角色)。 - tasks:主要任务(
main.yml),包括添加APT源、安装Logstash、配置SSL目录和证书、设置默认启动等。 - templates:存放Jinja2模板文件,如
02-beats-input.conf.j2、10-syslog-filter.conf.j2等。 - vars:变量文件(
main.yml),定义了Logstash的版本、日志和数据目录路径等。
三、Go安装¶
安装Go环境,兼容 RedHat 和 Debian(Ubuntu) 系统
1. 角色目录结构¶
roles/
go/
tasks/
main.yml # 主任务文件
variables.yml # 根据系统设置变量
setup-RedHat.yml # RedHat系统安装任务
setup-Debian.yml # Debian系统安装任务
vars/
main.yml # 公共变量
handlers/
main.yml # 处理器(若需要)
templates/
golang.sh.j2 # 环境变量脚本模板
meta/
main.yml # 元信息
以下是您提供的 Ansible Playbook 各个文件的调用顺序、执行逻辑以及各自的用途详细解释:
1. install_go.yml¶
调用方式:
这是入口文件,通过 ansible-playbook 执行,定义了目标主机和角色:
- 功能:
- 指定目标主机组(
centos7); - 确保任务以
root权限运行(通过become: true); - 调用角色
go,实际任务逻辑由该角色实现。
2. main.yml¶
调用方式:
install_go.yml 文件中调用的角色 go 会在内部加载 tasks/main.yml,作为角色的默认入口文件。
内容:
- ansible.builtin.include_vars: variables.yml
- ansible.builtin.include_tasks: setup-RedHat.yml
when: ansible_os_family == 'RedHat'
- ansible.builtin.include_tasks: setup-Debian.yml
when: ansible_os_family == 'Debian'
- name: Unsupported OS Family
fail:
msg: "This role only supports RedHat and Debian families. Detected: {{ ansible_os_family }}"
when: ansible_os_family not in ['RedHat', 'Debian']
- name: Verify Go installation
ansible.builtin.shell: go version
register: go_version_check
ignore_errors: yes
- name: Fail if Go installation failed
fail:
msg: "Go installation failed. Please check logs for more details."
when: go_version_check.rc != 0
-
功能:
-
加载变量文件:通过
include_vars加载variables.yml中的变量; -
根据操作系统类型调用子任务
:
- 如果是 RedHat 系列(如 CentOS),调用
setup-RedHat.yml; - 如果是 Debian 系列,调用
setup-Debian.yml; - 如果是其他系统类型,直接报错并退出;
- 如果是 RedHat 系列(如 CentOS),调用
-
验证安装结果
:
- 执行
go version检查安装是否成功; - 如果安装失败,触发失败任务并提示错误信息。
- 执行
3. variables.yml¶
调用方式:
main.yml 使用 ansible.builtin.include_vars 引入。
内容:
go_version: "1.22.5"
go_install_path: /usr/local/go
go_download_path: /usr/local/src
go_download_url: http://mirrors.sunline.cn/source/go/x86_64/go{{ go_version }}.linux-amd64.tar.gz
- 功能:
- 定义通用变量,例如 Go 的版本号、安装路径、下载路径及下载地址;
- 这些变量在其他任务文件(如
setup-RedHat.yml和setup-Debian.yml)中被引用,简化了重复配置。
4. setup-RedHat.yml¶
调用方式:
main.yml 中通过 ansible.builtin.include_tasks 调用,条件为 ansible_os_family == 'RedHat'。
内容:
- name: Install dependencies for RedHat
yum:
name: "{{ item }}"
state: present
loop:
- gcc
- sed
- git
- easy-rsa
- curl
- jq
- oathtool
- wget
- name: Download Go Source Package
get_url:
url: "{{ go_download_url }}"
dest: "{{ go_download_path }}/go{{ go_version }}.linux-amd64.tar.gz"
mode: '0644'
- name: Unarchive Go Source Package
unarchive:
src: "{{ go_download_path }}/go{{ go_version }}.linux-amd64.tar.gz"
dest: /usr/local
remote_src: yes
mode: '0755'
- name: Configure Go environment variables
template:
src: golang.sh.j2
dest: /etc/profile.d/golang.sh
mode: '0644'
- name: Reload environment variables
shell: source /etc/profile
- 功能:
- 安装 RedHat 系统所需的依赖包(如
gcc,wget,curl等); - 下载 Go 的源码包到指定目录;
- 解压并安装 Go 到
/usr/local; - 配置环境变量,使用模板文件
golang.sh.j2; - 刷新环境变量,确保立即生效。
5. setup-Debian.yml¶
调用方式:
main.yml 中通过 ansible.builtin.include_tasks 调用,条件为 ansible_os_family == 'Debian'。
内容:
- name: Install dependencies for Debian
apt:
name: "{{ item }}"
state: present
loop:
- build-essential
- wget
- tar
- curl
- name: Download Go Source Package
get_url:
url: "{{ go_download_url }}"
dest: "{{ go_download_path }}/go{{ go_version }}.linux-amd64.tar.gz"
mode: '0644'
- name: Unarchive Go Source Package
unarchive:
src: "{{ go_download_path }}/go{{ go_version }}.linux-amd64.tar.gz"
dest: /usr/local
remote_src: yes
mode: '0755'
- name: Configure Go environment variables
template:
src: golang.sh.j2
dest: /etc/profile.d/golang.sh
mode: '0644'
- name: Reload environment variables
shell: source /etc/profile
- 功能:
- 安装 Debian 系统所需的依赖包(如
wget,curl等); - 下载 Go 的源码包到指定目录;
- 解压并安装 Go 到
/usr/local; - 配置环境变量,使用模板文件
golang.sh.j2; - 刷新环境变量,确保立即生效。
6. golang.sh.j2¶
调用方式:
setup-RedHat.yml 和 setup-Debian.yml 中使用 template 模块生成环境变量文件。
内容:
export GOROOT={{ go_install_path }}
export GOPATH=/usr/local/gopath
export GO111MODULE="on"
export GOPROXY=https://goproxy.cn,direct
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
- 功能:
- 定义 Go 的环境变量,例如
GOROOT(Go 的安装路径)、GOPATH(工作目录)、GO111MODULE(模块支持)等; - 配置代理(
GOPROXY)以加速依赖下载; - 将 Go 的二进制文件路径添加到
PATH。
执行顺序总结¶
install_go.yml:入口文件,定义目标主机和角色;main.yml:角色入口,加载变量文件和任务文件;variables.yml:定义全局变量;- 根据操作系统类型:
- 如果是 RedHat 系列,调用
setup-RedHat.yml; - 如果是 Debian 系列,调用
setup-Debian.yml; - 通过
golang.sh.j2配置 Go 的环境变量; - 验证 Go 是否成功安装。
通过以上流程,Playbook 确保在不同操作系统上都能正确安装和配置 Go。