当前位置: 首页 > news >正文

Ansible企业级实战

Ansible企业级实战

  • 一、Playbook 的组成
    • 1、栗子
      • (1) 语法检测
      • (2) 预测试
      • (3) 列出主机
      • (4) 列出任务
      • (5) 列出标签
      • (6) 执行
      • (7) 验证
    • 2、任务列表和 action 介绍
    • 3、Handlers 介绍
    • 4、Templates
  • 五、Roles
    • 1.什么是 Roles
    • 2、案例 -- 利用 Roles 部署 MySQL
    • 3、运行并测试

一、Playbook 的组成

Playbook 是由一个或多个”play” 组成的列表,主要功能在于通过将 task 定义好的角色归并为一组进行统一管理,也就是通过 Task 调用 Ansible 的模板将多个 “play” 组织在一个 Playbook 中运行。

在这里插入图片描述

1、栗子

vim aaa.yml
---
- hosts: webremote_user: roottasks:- name: create useruser:name: lisipassword: "{{ 'aptech'|password_hash('sha512') }}"state: presenttags:- aaa
...

(1) 语法检测

ansible-playbook --syntax-check aaa.yml

请添加图片描述

(2) 预测试

ansible-playbook -C aaa.yml

请添加图片描述

(3) 列出主机

ansible-playbook --list-hosts aaa.yml

请添加图片描述

(4) 列出任务

ansible-playbook --list-tasks aaa.yml

请添加图片描述

(5) 列出标签

ansible-playbook --list-tags aaa.yml

请添加图片描述

(6) 执行

ansible-playbook aaa.yml

请添加图片描述

(7) 验证

ansible web -m shell -a 'cat /etc/passwd'

请添加图片描述

2、任务列表和 action 介绍

“Play” 的主体是任务列表(Tasks list)。任务列表中的任务按照次序逐个在 hosts 中指定的所有主机上执行,在顺序执行这些任务时,如果发生错误会将所有已执行任务回滚。因此,需要在更正 Playbook 中的错误后重新执行这些任务。
Task 的任务是按照指定的参数去执行模块。每个 task 使用 name 输出 Playbook 的运行结果,一般输出内容为描述该任务执行的步骤。如果没有提供将输出 action 的运行结果。
定义 task 的格式可以用”action:module options” 或”module:options” 都可,其中后者可以实现向后兼容。如果 action 的内容过多,可在行首使用空白字符进行换行。

vim aaa.yml
---
- hosts: webremote_user: roottasks:- name: create useruser:name: lisipassword: "{{ 'aptech'|password_hash('sha512') }}"state: presenttags:- aaa- hosts: dbremote_user: roottasks:- name: copy filecopy: src=/etc/passwd dest=/opttags:- bbb...

如果多次去执行修改的 Playbook 时,涉及到一些没有变化的代码,可以使用 tages 让用户选择跳过没有变化代码,只运行 Playbook 中发生变化的部分代码。可以 在 Playbook 中 为 某 个 或 某 些任务定义 “标签”,在执行此 Playbook 时通过 ansible - playbook 命令的 – tags 选项能实现仅运行指定的 tasks 而非所有的 tasks。

ansible-playbook aaa.yml --tags "bbb"

请添加图片描述

3、Handlers 介绍

Handlers 用于当关注的资源发生变化时所采取的操作。在 notify 中列出的操作便称为 handler,也就是 notify 中需要调用 handler 中定义的操作。而 notify 这个动作用于在每个 “play” 的最后被触发,仅在所有的变化发生完成后一次性地执行指定操作。

(1) 安装apache并修改监听端口

dnf -y install httpd
mkdir conf
cp /etc/httpd/conf/httpd.conf  conf/
cd conf/
sed -i 's/Listen 80/Listen 8080/g' /root/conf/httpd.conf

请添加图片描述
(2) 同步配置文件并验证
同步

vim apache.yml
- hosts: webremote_user: roottasks:- name: install apacheyum: name=httpd state=latest- name: copy filecopy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf- name: start httpdservice: enabled=true name=httpd state=started

验证

ansible web -m shell -a 'netstat -anpt | grep httpd'

请添加图片描述
(3) 设置handlers

sed -i 's/Listen 8080/Listen 8888/g' /root/conf/httpd.conf
ansible-playbook bbb.yml
ansible web -m shell -a 'netstat -anpt | grep httpd'

请添加图片描述

4、Templates

Jinja 是基于 Python 的模板引擎。Template 类似 Jinja 的另一个重要组件,可以看作是一个编译过的模板文件。用来产生目标文本,传递 Python 的变量给模板去替换模板中的标记。
(1) 创建模板文件

mkdir templates
cp conf/httpd.conf templates/httpd.conf.j2
sed -i 's/Listen 8888/Listen {{ http_port }}/g' /root/templates/httpd.conf.j2
sed -i 's/#ServerName www.example.com:80/ServerName {{ ansible_fqdn }}/g' /root/templates/httpd.conf.j2

(2) 为远程主机添加变量

sed -i '2s/$/ http_port=9999/' /etc/ansible/hosts
sed -i '5s/$/ http_port=10000/' /etc/ansible/hosts

(3) 编写playbook

vim ccc.yml
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpdyum: name={{ package }} state=latest- naem: chage conf_filetemplate: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: start httpdservice: enabled=true name={{ service }} state=startedhandlers:- name: restart httpdservice: name={{ service }} state=restarted

(4) 运行

ansible-playbook ccc.yml

请添加图片描述
(5) 验证

ansible all -m shell -a 'cat /etc/httpd/conf/httpd.conf|grep ^Listen'
ansible all -m shell -a 'cat /etc/httpd/conf/httpd.conf|grep ^ServerName'

请添加图片描述

五、Roles

目录结构
在这里插入图片描述

1.什么是 Roles

Ansible 为了层次化、结构化地组织 Playbook,使用了角色(roles),可以根据层次结构自动装载变量文件、tasks 以及 handlers 等。只需要在 Playbook 中使用 include 指令便可使用 roles。简单来讲,roles 就是分别将变量、文件、任务、模块及处理器设置于单独的目录中,便捷地使用它们。

2、案例 – 利用 Roles 部署 MySQL

mkdir mysql && cd mysqlmkdir vars && cd vars && touch main.yml && cd ..
cat <<EOF> /root/mysql/vars/main.yml
mysql_port: 3306
mysql_user: root
EOFmkdir tasks && cd tasks && touch main.yml && cd ..cat <<EOF>/root/mysql/tasks/main.yml
- name: install mysqlyum: name: mysql-serverstate: present
- name: start mysqlservice:name: mysqldstate: startedenabled: yes
- name: mysql configtemplate:src: my.cnf.j2dest: /etc/my.cnfnotify: restart mysql
EOFmkdir handlers && cd handlers && touch main.yml && cd ..
cat <<EOF>/root/mysql/handlers/main.yml
- name: restart mysqlservice:name: mysqldstate: restarted
EOFmkdir templates && cd templates && touch my.cnf.j2 && cd ..
cat<<EOF>/root/mysql/templates/my.cnf.j2
[mysqld]
port = {{ mysql_port }}
user = {{ mysql_user }}
EOFcd
cat <<EOF> ddd.yml
- hosts: dbroles:- mysql
EOF

文件说明

mkdir vars && cd vars && touch main.yml && cd ..  # 创建vars目录及主变量文件
# 写入MySQL端口和用户变量到vars/main.yml
cat <<EOF> /root/mysql/vars/main.yml
mysql_port: 3306  # MySQL服务端口
mysql_user: root  # MySQL运行用户
EOFmkdir tasks && cd tasks && touch main.yml && cd ..  # 创建tasks目录及主任务文件
# 写入MySQL部署任务到tasks/main.yml
cat <<EOF>/root/mysql/tasks/main.yml
- name: install mysql  # 安装MySQL服务器yum: name: mysql-serverstate: present
- name: start mysql  # 启动MySQL服务并设置开机自启service:name: mysqldstate: startedenabled: yes
- name: mysql config  # 配置MySQL,使用模板文件template:src: my.cnf.j2  # 模板源文件dest: /etc/my.cnf  # 目标配置文件notify: restart mysql  # 配置变更时通知重启MySQL
EOFmkdir handlers && cd handlers && touch main.yml && cd ..  # 创建handlers目录及文件
# 写入MySQL重启处理器到handlers/main.yml
cat <<EOF>/root/mysql/handlers/main.yml
- name: restart mysql  # 重启MySQL服务的处理器service:name: mysqldstate: restarted
EOFmkdir templates && cd templates && touch my.cnf.j2 && cd ..  # 创建templates目录及模板文件
# 写入MySQL配置模板到my.cnf.j2(使用变量)
cat<<EOF>/root/mysql/templates/my.cnf.j2
[mysqld]
port = {{ mysql_port }}  # 引用变量
user = {{ mysql_user }}  # 引用变量
EOFcd
cat <<EOF> ddd.yml  # 创建主执行剧本
- hosts: db  # 对db组的主机执行roles:- mysql  # 应用mysql角色
EOF

3、运行并测试

ansible-playbook ddd.yml
ansible db -m shell -a 'netstat -anpt | grep mysqld'

请添加图片描述

http://www.lryc.cn/news/621139.html

相关文章:

  • 设计模式(2)
  • sql的关键字 limit 和offset
  • 第16届蓝桥杯C++中高级选拔赛(STEMA)2024年10月20日真题
  • Ansys FreeFlow入门:对搅拌罐进行建模
  • pull request是啥意思
  • Serverless 架构核心解析与应用实践
  • 第三十一天(系统io)
  • 如何让手机访问本地服务器部署的网页?无公网IP内网主机应用,自定义外网地址,给任意网设备访问
  • 从0-1学习Java(三)快速了解字符串、数组、“==“与equals比较
  • 【框架】跨平台开发框架自用整理
  • 每日任务day0814:小小勇者成长记之钓鱼日记(字典推导式)
  • Steam移动游戏存储位置
  • 如何使用 AI 大语言模型解决生活中的实际小事情?
  • 《算法导论》第 25 章:所有结点对的最短路径问题
  • 深入解析 GitHub Actions 工作流文件编写:从入门到实战
  • flutter 开发 鸿蒙 App
  • 解决因取消VMware快照删除导致的虚拟机磁盘损坏问题
  • shellgpt
  • AI大模型+Meta分析:助力发表高水平SCI论文
  • 部署文件到受管主机
  • 远程影音访问:通过 cpolar 内网穿透服务使用 LibreTV
  • 高效TypeScript开发:VSCode终极配置指南
  • 莫队 + 离散化 Ann and Books
  • 浏览器面试题及详细答案 88道(34-44)
  • 宝塔配置反向代理
  • 机器学习基础讲解
  • Linux:Samba 服务部署
  • 机器学习学习总结
  • 基于机器学习的文本情感极性分析系统设计与实现
  • 【深度学习】深度学习的四个核心步骤:从房价预测看机器学习本质