自动化之ansible(二)
一、ansible中playbook(剧本)
官方文档:
Ansible playbooks — Ansible Community Documentation
1、playbook的基本结构
一个基本的playbook由以下几个主要部分组成
hosts: 定义要执行任务的主机组或主机。
become: 是否需要使用超级用户权限(如 sudo)。
vars: 在 Playbook 中定义变量。tasks: 任务列表,指定要执行的操作。
注:playbook:由一个play或者多个play组成,一个paly可以包含多个task任务
ansible中playbook的文件结尾是.yml格式后缀
示例:
---
- name: Playbook名称
hosts: 主机组
become: true # 是否需要使用管理员权限(sudo)
vars: # 可选部分,定义变量
variable_name: value
tasks: # 任务列表
- name: 任务1名称
module_name: # Ansible模块名称
parameter1: value1
parameter2: value2
- name: 任务2名称
module_name:
parameter1: value1
name: Playbook或Play的名称,通常用于描述Playbook的作用。
hosts: 要运行任务的主机组。可以是inventory中定义的主机组,也可以是单个主机(如localhost)
become: 设为true时,任务将以管理员权限(sudo)执行。
vars: 定义变量,在Playbook中全局可用。
tasks: 包含一个或多个任务,每个任务由名称和模块组成。每个任务都会通过特定的模块来执行指定的操作。
2、安装和启动nginx
[master-61 root ~/playbook] # cat nginx.yml
---
- name: install nginx
hosts: web
become: true
tasks:
- name: install nginx
yum:
name: nginx
state: present
- name: start nginx
service:
name: nginx
state: started
enabled: true
在执行playbook脚本时报错了如下:
web7主机出现系统的文件系统被挂载为只读模式,导致没法执行yml脚本
解决方法:登录上web-7主机,将文件系统重新挂载为读写模式
检查文件系统的挂载状态,确认是否为只读模式
[web-7 root ~] # mount | grep ' / '
/dev/mapper/centos-root on / type xfs (ro,relatime,attr2,inode64,noquota)
ro 表示只读,这就意味着文件系统被挂载为只读模式
重新挂载为读写模式,重新挂载根文件系统(/)为读写模式
[web-7 root ~] # mount -o remount,rw /
[web-7 root ~] # df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 979M 0 979M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.5M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root 37G 2.1G 35G 6% /
/dev/sda1 1014M 140M 875M 14% /boot
tmpfs 199M 0 199M 0% /run/user/0
[web-7 root ~] # ls /root/
anaconda-ks.cfg .bash_history .bash_profile .cshrc .pki/ .tcshrc
.ansible/ .bash_logout .bashrc network.sh .ssh/ .viminfo
重新执行playbook
先执行命令检查一下是否正常
[master-61 root ~/playbook] # ansible-playbook -C nginx.yml
PLAY [install nginx] **********************************************************************************
TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.7]
TASK [install nginx] **********************************************************************************
changed: [172.16.1.7]
TASK [start nginx] ************************************************************************************
changed: [172.16.1.7]
PLAY RECAP ********************************************************************************************
172.16.1.7 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
执行剧本
[master-61 root ~/playbook] # ansible-playbook nginx.yml
PLAY [install nginx] **********************************************************************************
TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.7]
TASK [install nginx] **********************************************************************************
changed: [172.16.1.7]
TASK [start nginx] ************************************************************************************
changed: [172.16.1.7]
PLAY RECAP ********************************************************************************************
172.16.1.7 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
验证web-7机器是否安装启动成功
二、ansible中roles角色
1、roles介绍
roles相当于是在ansible中playbooks的目录组织结构。它可以将任务(tasks)、变量(vars)、文件(files)、模板(templates)、处理器(handlers)、默认值(defaults)、以及其他资源分组到一个单独的目录中,提升代码的可维护性。
2、roles目录结构如下
my_role/
├── defaults/
│ └── main.yml # 默认变量
├── files/ # 存放静态文件
├── handlers/
│ └── main.yml # 任务完成后的处理器
├── meta/
│ └── main.yml # 角色的元数据,例如依赖关系
├── tasks/
│ └── main.yml # 主要的任务文件
├── templates/ # 存放 Jinja2 模板文件
├── tests/
│ └── test.yml # 测试脚本
└── vars/
└── main.yml # 存放变量
每个目录的用途如下:
defaults/main.yml:定义角色的默认变量,变量值可以被 Playbook 或其它角色覆盖。
files/:存放一些静态的文件,可以通过 copy 或 template 模块来部署到目标主机。
handlers/main.yml:用于定义触发特定条件时执行的处理器。通常是服务的重启、重载等操作。
meta/main.yml:描述角色的元数据,如角色的依赖关系、作者信息等。
tasks/main.yml:包含角色的任务,定义了这个角色执行的具体工作。
templates/:存放 Jinja2 模板文件。你可以在角色中使用模板来动态生成文件。
tests/test.yml:用于测试角色是否正常工作,通常会包含一些验证任务,确保角色行为符合预期。
vars/main.yml:存放角色的变量,这些变量在 Playbook 中可以覆盖。
3、创建roles角色
命令:ansible-galaxy init 角色名
(11:04:31)[master-61 root /etc/ansible/roles] # ansible-galaxy init my_role
- Role my_role was created successfully
(11:04:35)[master-61 root /etc/ansible/roles] #
(11:04:38)[master-61 root /etc/ansible/roles] # tree my_role/
my_role/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
4、使用roles角色
roles角色的执行流程:
定义tasks任务 --> 定义jinja2模板,作为配置文件用 --> 定义变量 --> 定义触发 --> 定义roles的yml文件 -->检查yml语法 --> 执行roles.yml文件 --> 查看nginx服务启动状态
4.1定义任务,在task/main.yml文件中定义任务
(14:45:56)[master-61 root /etc/ansible/roles/nginx] # cat tasks/main.yml
---
- name: "Install wget"
yum:
name: "wget"
state: "present"
- name: "Download nginx package"
get_url:
url: "http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.18.0-1.el7.ngx.x86_64.rpm"
dest: "/etc/ansible/roles/nginx/files/"
- name: "Copy nginx package to /tmp"
copy:
src: "nginx-1.18.0-1.el7.ngx.x86_64.rpm"
dest: "/tmp/nginx-1.18.0-1.el7.ngx.x86_64.rpm"
- name: "Install nginx from rpm package"
yum:
name: "/tmp/nginx-1.18.0-1.el7.ngx.x86_64.rpm"
state: "latest"
- name: "Configure nginx"
template:
src: "nginx.conf.j2"
dest: "/etc/nginx/nginx.conf"
tags:
- "nginxconf"
notify:
- "Reload nginx configuration"
- name: "Start nginx service"
service:
name: "nginx"
state: "started"
enabled: true
4.2 定义templates生成配置文件
(16:23:43)[master-61 root /etc/ansible/roles/nginx] # cat templates/nginx.conf.j2
user nginx; # 设置 Nginx 服务的系统使用用户
worker_processes {{ ansible_processor_vcpus }}; # 工作进程数
error_log /var/log/nginx/error.log warn; # Nginx 的错误日志
pid /var/run/nginx.pid; # Nginx 启动时的 PID
events {
worker_connections 1024; # 每个进程允许的最大连接数
}
http { # HTTP 请求配置,一个 http 可以包含多个 server
include /etc/nginx/mime.types; # 定义 Content-Type
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; # 访问日志
sendfile on; # 高效文件传输
keepalive_timeout 65; # 客户端与服务端的超时时间
server { # HTTP 服务,一个 server 可以配置多个 location
listen {{ nginx_config.nginx_port }}; # 服务监听端口
server_name localhost; # 主机名、域名
location / {
root /usr/share/nginx/html; # 页面存放目录
index index.html index.htm; # 默认页面
}
error_page 500 502 503 504 /50x.html; # 错误页面重定向
location = /50x.html {
root /usr/share/nginx/html; # 页面存放的目录
}
}
include /etc/nginx/conf.d/*.conf; # 包含其他配置文件
}
4.3定义变量,在vars/main.yml文件中定义变量
(14:49:48)[master-61 root /etc/ansible/roles/nginx] # vim vars/main.yml
---
nginx_config:
nginx_port:888
4.4 定义触发
(16:25:55)[master-61 root /etc/ansible/roles/nginx] # cat handlers/main.yml
---
- name: reload new config
service:
name: nginx
statr: restarted
4.5定义剧本文件
(16:26:42)[master-61 root /etc/ansible/roles/nginx] # cat roles.yml
- hosts: web
remote_user: root
roles:
- nginx
4.6 检查yml文件语法是否正确,如果报错需要检查对应配置文件
(16:27:11)[master-61 root /etc/ansible/roles/nginx] # ansible-playbook --syntax-check roles.yml
playbook: roles.yml
4.7 执行roles.yml文件
(10:48:31)[master-61 root /etc/ansible/roles/nginx] # ansible-playbook roles.yml
PLAY [web] ********************************************************************************************
TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.8]
ok: [172.16.1.7]
TASK [nginx : Install wget] ***************************************************************************
ok: [172.16.1.7]
ok: [172.16.1.8]
TASK [Download nginx package] *************************************************************************
ok: [172.16.1.7]
ok: [172.16.1.8]
TASK [Install nginx from rpm package] *****************************************************************
ok: [172.16.1.7]
ok: [172.16.1.8]
TASK [Configure nginx] ********************************************************************************
changed: [172.16.1.7]
changed: [172.16.1.8]
TASK [Start nginx service] ****************************************************************************
changed: [172.16.1.7]
changed: [172.16.1.8]
PLAY RECAP ********************************************************************************************
172.16.1.7 : ok=6 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.16.1.8 : ok=6 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
4.8 检查服务启动状态
web-7和web-8中nginx服务都正常启动
网页访问也正常