小阿轩yx-案例:Ansible剧本文件实践

news/2024/9/28 7:02:19 标签: 云计算, linux, 运维开发, 云平台, ansible, 剧本实践

小阿轩yx-案例:Ansible剧本文件实践

Playbook 介绍

什么是 playbook

  • playbook 顾名思义,即剧本,现实生活中演员按照剧本表演
  • ansible 中,由被控计算机表演,进行安装,部署应用,提供对外的服务等,以及组织计算机处理各种各样的事情。
  • playbook 是 ansible 用于配置,部署,和管理节点的剧本通过 playbook 的详细描述,执行其中的一些列 tasks,可以让远端的主机达到预期的状态。
  • playbook 就像 ansible 控制器给被控节点列出的一系列 to-do-list,而且被控节点必须要完成。

Ansible play 使用场景

  • 执行一些简单的任务,使用 ad-hoc 命令可以方便的解决问题,但有时一个设施过于复杂需要大量的操作的时,执行的 ad-hoc 命令是不合适的,这时候最好使用 playbook。
  • 就像执行 shell 命令与写 shell 脚本一样,也可以理解为批处理任务,不过 playbook 有自己的语法格式使用 playbook 可以方便的重复使用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。
  • 使用 Ansible 的过程中,会发现,处理的大部分操作都是编写playbook。
  • 可以把常见的应用都编写为 playbook,之后管理服务器会变得很简单。

Playbook 的组成

  • 由一个或多个 “play” 组成的列表

主要功能

  • 通过将 task 定义好的角色归并为组进行统一管理
  • 也就是通过 Task 调用 Ansible 的模板将多个 “play” 组织在一个 Playbook 中运行

Playbook 本身由下面几部分组成

  • Tasks:任务,即调用模块完成的某操作;
  • Variables:变量;
  • Templates:模板;
  • Handlers:处理器,某条件满足时,触发执行的操作;
  • Roles:角色。

恢复上一章 Ansible 部署的快照

Playbook 的简单示例

[root@ansible-node1 ~]# vi a.yml
---
- hosts: web
  remote user:root
  tasks :
    - name: create user
      user:
        name: zhangsan
        password: "{{ 'aptech' | password_hash('sha512') }}"
        state: present
      tags:
      - CCC
...

执行 playbook,进行语法检查

[root@ansible-node1 ~]# ansible-playbook --syntax-check a.yml

预测试

[root@ansible-node1 ~]# ansible-playbook -C a.ym1

列出主机

[root@ansible-node1 ~]# ansible-playbook --list-hosts a.yml

列出任务

[root@ansible-node1 ~]# ansible-playbook --list-tasks a.yml

列出标签

[root@ansible-node1 ~]# ansible-playbook --list-tags a.yml

执行任务

[root@ansible-node1 ~]# ansible-playbook a.yml

Hosts 和 Users 介绍

Playbook 的设计目的

  • 为了让某个或某些主机以某个用户身份去执行完成相应的任务。
  • 用于指定要执行指定任务的主机用 hosts 定义,可以是一个也可以是由冒号分隔的多个主机组;
  • 用于指定被管理主机上执行任务的用户用 remote user 来定义

如示例所示

- hosts: web
  remote_user: zhangsan

remote_user 也可定义指定用户通过 sudo 的方法在被管理主机上运行指令, 甚至可以在使用sudo 时用 sudo user 指定 sudo 切换的用户。

[root@ansible-node1 ~]# vim b.yaml
---
- hosts: web
  remote_user: zhangsan
  tasks:
    - name: test connection
      ping:
...

远程连接拷贝

[root@ansible-node1 ~]# ssh-copy-id zhangsan@192.168.10.102

执行

[root@ansible-node1 ~]# ansible-playbook b.yaml

任务列表和 action 介绍

  • Play” 的主体是任务列表(Tasks list)。
  • 任务列表中的任务按照次序逐个在 hosts 中指定的所有主机上执行,在顺序执行这些任务时,如果发生错误会将所有已执行任务回滚。
  • 因此,需要在更正 Playbook 中的错误后重新执行这些任务。

Task 的任务

  • 按照指定的参数去执行模块。
  • 每个 task 使用 name 输出 Playbook 的运行结果一般输出内容为描述该任务执行的步骤。
  • 如果没有提供将输出 action 的运行结果。
  • 定义 task 的格式可以用 “action:module options” 或 “module:options” 都可,其中后者可以实现向后兼容
  • 如果 action 的内容过多,可在行首使用空白字符进行换行。
[root@ansible-node1 ~]# vi a.yml
---
- hosts: web
  remote_user: root
  tasks:
    - name: create usen
      user:
        name: zhangsan
        password: "{{ 'aptech' | password_hash('sha512') }}"
        state: present
      tags:
- hosts: db
  remote_user: root
  tasks:
    - name: copy file to web
      copy: src=/etc/passwd dest=/opt
      tags:
      - ddd
...
  • - hosts: db
  •   remote_user: root
  •   tasks:
  •     - name: copy file to web
  •       copy: src=/etc/passwd dest=/opt
  •       tags:
  •       - ddd

执行

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

Handlers 介绍

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

拷贝模板文件为 /etc/foo.conf 文件时,重新启动 memcached 和 apache 服务

创建 conf 目录

[root@ansible-node1 ~]# mkdir conf

安装 httpd

[root@ansible-node1 ~]# yum -y install httpd

拷贝文件到指定目录下

[root@ansible-node1 ~]# cp /etc/httpd/conf/httpd.conf conf

修改配置文件

[root@ansible-node1 ~]# vim conf/httpd.conf
Listen 8080 //修改端口号

编写配置文件 

[root@ansible-node1 ~]# vim a.yml
- host: web
  remote_user: root
  tasks:
  - name: install httpd package
    yum: name=httpd state=latest
  - name: install configuration file or httpd
    copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
  - name: start httpd service
    service: enabled=true name=httpd state=started

执行

[root@ansible-node1 ~]# ansible-playbook a.yml

登录被管理主机 ansible-node2

[root@ansible-node2 ~]# rpm -qa httpd

查看执行结果

[root@ansible-node2 ~]# grep "Listen" /etc/httpd/conf/httpd.conf | grep -v "#"

查看状态

[root@ansible-node2 ~]# systemctl status httpd

设置 handlers

  • 如果配置文件有改动
  • 如:Apache 端口号改变,则需要定义 notify 和 handlers,触发更新相关执行操作。

修改端口号

[root@ansible-node1 ~]# vim conf/httpd.conf
Listen 808

编写文件

[root@ansible-node1 ~]# vim b.yml
---
- hosts: web
  remote_user: root
  tasks:
    - name: change port
      copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify:
        - restart httpd server
  handlers:
    - name: restart httpd server
      service: name=httpd state=restarted
...

执行

[root@ansible-node1 ~]# ansible-playbook b.yml

node2 上要关闭 selinux,否则,同步配置会出错

登录被管理主机 ansible-node2 进行查看

[root@ansible-node2 ~]# netstat -anpt | grep httpd

Templates 介绍

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

创建 templates 目录

[root@ansible-node1 ~]# mkdir templates

拷贝文件到指定目录下

[root@ansible-node1 ~]# cp conf/httpd.conf templates/httpd.conf.j2

创建模板文件

[root@ansible-node1 ~]# vim templates/httpd.conf.j2
Listen {{ http_port }}
ServerName {{ ansible_fqdn }}

为远程主机添加变量

[root@ansible-node1 ~]# vim /etc/ansible/hosts
[web]
192.168.10.102 http_port=8888
[db]
192.168.10.103
  • http_port=8888

编写 playbook 文件

[root@ansible-node1 ~]# vim apache.yml
- hosts: web
  remote_user: root
  vars:
  - package: httpd
  - service: httpd
  tasks:
  - name: install httpd package
    yum: name={{ package }} state=latest
  - name: install configuration file for httpd
    template: src=/root/templates/httpd.conf,i2 dest=/etc/httpd/conf/httpd.conf
    notify:
    - restart httpd
  - name: start httpd service
    service: enabled=true name={{ service }} state=started
  handlers:
  - name: restart httpd
    service: name={{ service }} state=restarted
  • - restart httpd
  • - name: restart httpd

执行

[root@ansible-node1 ~]# ansible-playbook apache.yml

登录被管理主机 ansible-node2, 执行查看命令

[root@ansible-node2 ~]# grep -i listen /etc/httpd/conf/httpd.conf | grep -v "#"
[root@ansible-node2 ~]# grep -i servername /etc/httpd/conf/httpd.conf | grep -v "#"

Roles 介绍

什么是 Roles

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

利用 Roles 部署 mariadb

被管理主机配置 yum 源

配置数据库角色

[root@node1 ~]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
mkdir: 已创建目录 "/etc/ansible/roles/mariadb"
mkdir: 已创建目录 "/etc/ansible/roles/mariadb/files"
mkdir: 已创建目录 "/etc/ansible/roles/mariadb/tasks"
mkdir: 已创建目录 "/etc/ansible/roles/mariadb/handlers"

进入 tasks 目录

[root@node1 ~]# cd /etc/ansible/roles/mariadb/tasks/

编写主文件

[root@nodel tasks]# vi main.yml
---
- name: install mariadb
  yum: name=mariadb-server state=present
- name: install MySOL-python
  yum: name=MySOL-python state=present
- name: move config mariadb
  shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file
  copy: src=my.cnf dest=/etc/my.cnf
- name: reload mariadb
  shell: systemctl restart mariadb
- name: create database testdb
  shell: mysql -u roote -e "create database testdb;grant all on testdb.* to test'@'192.168.10.%' identified by 'test123';flush privileges;
  notify:
  - restart mariadb
...

切换至 handlers 目录

[root@node1 tasks]# cd /etc/ansible/roles/mariadb/handlers

编写触发器文件

[root@localhost handlers]# vi main.yml
---
- name:restart mariadb
  service: name=mariadb state=restarted
...

切换至 files 目录

[root@nodel tasks]# cd /etc/ansible/roles/mariadb/files

查看

[root@node1 files]# ls
my.cnf    ##将编辑好的 my.cnf 文件拷贝在此处

切换至 ansible 目录

[root@node1 files]# cd /etc/ansible

编写角色文件

[root@nodel ansible]# vi mariadb.yml
---
- hosts: db
  remote_user: root
  roles:
  - mariadb
...

测试角色文件

[root@nodel ansible]# ansible-playbook --syntax-check mariadb.yml

执行 yml 文件

[root@nodel ansible]# ansible-playbook mariadb.yml

检查远程服务器上数据库

  • 查看数据库信息,看看有没有创建制定的数据库

利用 Ansible 管理数据库

ansible 查看数据库

[root@localhost ~]# ansible db -m shell -a 'mysql -u root -e "show databases;"'
192.168.10.103 | SUCCESS >> Database
information_schema
mysql
performance_schema
test
testdb

创建账户并授权

[root@localhost ~]# ansible db -m yum -a "name=MySQL-python state=present"
[root@localhost ~]# ansible db -m mysql_user -a "name=zhangsan password=pwd123 host=192.168.10.% priv=*.*:ALL"
[root@localhost ~]# ansible db -m mysql_user -a "name=lisi password=pwd123 priv=*.*:ALL"
  • 张三能够远程登录,但李四不能
  • 要想使用 mysql_user 模块,需要在客户端安装MySQL-python,安装时注意大小写

为老用户授权(语法和创建用户并授权的语法是相同的)

[root@localhost ~]# ansible db -m mysql_user -a "name=root password=pwd123 host=192.168.10.% priv=*.*:ALL"

小阿轩yx-案例:Ansible剧本文件实践


http://www.niftyadmin.cn/n/5680610.html

相关文章

WebAssembly与WebGPU:游戏开发的新时代

文章目录 WebAssembly简介WebGPU简介Wasm WebGPU 在游戏开发中的优势创建一个简单的WebAssembly模块使用WebGPU绘制一个三角形WebAssembly 的高级特性内存管理异步加载与多线程 WebGPU 的高级特性着色器编程计算着色器 实战案例:创建一个简单的 2D 游戏游戏逻辑设计…

无人机之虚拟云台技术篇

一、概念解释 虚拟云台技术,并非直接安装在无人机上的机械装置,而是通过软件算法和传感器技术,模拟出物理云台的功能,实现对相机或传感器的稳定控制。这种技术通过高精度的算法和实时数据处理,能够在无人机飞行过程中&…

C# + SQLiteExpert 进行(cipher)加密数据库开发+Costura.Fody 清爽发布

一:让 SQLiteExpert 支持(cipher)加密数据库 SQLiteExpert 作为SQlite 的管理工具,默认不支持加密数据库的,使其成为支持(cipher)加密数据库的管理工具,需要添加e_sqlcipher.dll &…

RabbitMQ 实验入门

使用 spring-amqp 实验 发布订阅模型 fanoutExchange 实验 实验步骤: 编写定义 队列 和 交换机 绑定关系的代码创建接口,模拟生产者,方便调试(接受参数 队列名、路由键、[消息])定义消费者 代码示例: C…

yolo自动化项目实例解析(七)自建UI--工具栏选项

在上一章我们基本实现了关于预览窗口的显示,现在我们主要完善一下工具栏菜单按键 一、添加工具栏ui 1、配置文件读取 我们后面要改的东西越来越多了,先加个变量文件方便我们后面调用 下面我们使用的config.get意思是从./datas/setting.ini文件中读取关键…

Python编码系列—Python责任链模式:打造灵活的请求处理流程

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

什么是原生IP?

代理IP的各个类型称呼有很多,且它们在网络使用和隐私保护方面扮演着不同的角色。今天将探讨什么是原生IP以及原生IP和住宅IP之间的区别,帮助大家更好地理解这两者的概念和实际应用,并选择适合自己的IP类型。 一、什么是原生IP? 原…

从日志到洞察:轻松实现服务器安全管理的神器

在当今复杂多变的网络环境中,服务器安全管理已成为一项不可或缺的任务。然而,面对海量的日志数据,如何快速精准地提取有价值的信息,并及时发现潜在的安全威胁?本文将为您介绍一款强大的服务器日志检索与查杀工具&#…