自动化之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格式后缀

示例:

bash 复制代码
---
- 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

bash 复制代码
[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主机,将文件系统重新挂载为读写模式

bash 复制代码
检查文件系统的挂载状态,确认是否为只读模式
[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

bash 复制代码
先执行命令检查一下是否正常
[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   
  

执行剧本

bash 复制代码
[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目录结构如下

bash 复制代码
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 角色名

bash 复制代码
(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文件中定义任务

bash 复制代码
(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生成配置文件

bash 复制代码
(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文件中定义变量

bash 复制代码
(14:49:48)[master-61 root /etc/ansible/roles/nginx] # vim  vars/main.yml 
---
nginx_config:
  nginx_port:888

4.4 定义触发

bash 复制代码
(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定义剧本文件

bash 复制代码
(16:26:42)[master-61 root /etc/ansible/roles/nginx] # cat roles.yml 
- hosts: web
  remote_user: root
  roles: 
    - nginx

4.6 检查yml文件语法是否正确,如果报错需要检查对应配置文件

bash 复制代码
(16:27:11)[master-61 root /etc/ansible/roles/nginx] # ansible-playbook --syntax-check roles.yml 

playbook: roles.yml

4.7 执行roles.yml文件

bash 复制代码
(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服务都正常启动

网页访问也正常

相关推荐
七夜zippoe7 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy6488 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满8 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠9 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey9039 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技10 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀10 小时前
Linux环境变量
linux·运维·服务器
zzzsde10 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º12 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~12 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化