Ansible 多机自动化工具 初学笔记

news2024/11/24 4:45:18

此文档仅张聪明同学个人笔记;新负责KTH-RPL Cluster GPU的漫漫学习长路

English Docs:

  1. official https://docs.ansible.com/ansible/latest/index.html

中文相关文档:

  1. https://ansible.leops.cn/basic/Quickstart/
  2. https://blog.csdn.net/xinshuzhan/article/details/115915698 ← 这篇博文写的更为仔细

请注意下面有引用框的 均为这些参考文档中的话语,相关图片也由他们而来,不再在文中单独说明


测试学习阶段 请不要运行危险的指令,比如 rm -rf * 当然你没有sudo的话 删的只是自己用户下的 问题不大,切记管理人员 不要运行 自己直接copy过来看都没看的script 或者 指令! 建议以下学习时,就打印打印信息

简要介绍

Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具
它用Python写成,类似于saltstack和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。 它使用SSH来和节点进行通信。
Ansible基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言,更强的远程命令执行操作。

主要呢 可以通过这幅图看出来,也就是东西是装在你自己的主机上的:

  1. 通过 主机清单 和playbooks进行配置 当然也可以单独就运行一段指令 后续的实践部分再介绍
  2. 主机【也就是自己的电脑】通过SSH 进行其他机器的连接
  3. 然后就可以 快乐一个ansible 所有ssh 机器都执行

所以ansible 是安装在自己电脑上的 [没错 我一开始以为每个node server都得装 hhhh 理解没到位

安装

sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible

当然因为本身是Python 代码 可以通过pip install或者是conda install进行library的安装,建议感兴趣的可以看 官方文档的 这个部分

安装完后 第一件事! 所有的工具类 安装完后都可以试着运行 —help 去快速了解指令

ansible --help

常用指令开头为 截取至 官方文档 建议都再次 --help

ansible
ansible-inventory
ansible-playbook
ansible-config
ansible-console
ansible-doc
ansible-galaxy
ansible-pull
ansible-vault

初步尝试

根据上面简要介绍中内容,我们首先确定一下 ansible 知道的host 应该是什么? 才能去连接到各个节点进行指令运行

设置 host

根据官方文档 我们得知 应该要写一个 /etc/ansible/hosts 内容大概长这样

mail.example.com

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com
  • 然后我们回到自己电脑上可以看到 有一个这样的文件 打开虽然都注释掉了 但也能理解

    #
    #   - Comments begin with the '#' character
    #   - Blank lines are ignored
    #   - Groups of hosts are delimited by [header] elements
    #   - You can enter hostnames or ip addresses
    #   - A hostname/ip can be a member of multiple groups
    
    # Ex 1: Ungrouped hosts, specify before any group headers:
    
    ## green.example.com
    ## blue.example.com
    ## 192.168.100.1
    ## 192.168.100.10
    
    # Ex 2: A collection of hosts belonging to the 'webservers' group:
    
    ## [webservers]
    ## alpha.example.org
    ## beta.example.org
    ## 192.168.1.100
    ## 192.168.1.110
    
    # If you have multiple hosts following a pattern, you can specify
    # them like this:
    
    ## www[001:006].example.com
    
    # Ex 3: A collection of database servers in the 'dbservers' group:
    
    ## [dbservers]
    ##
    ## db01.intranet.mydomain.net
    ## db02.intranet.mydomain.net
    ## 10.25.1.56
    ## 10.25.1.57
    
    # Here's another example of host ranges, this time there are no
    # leading 0s:
    
    ## db-[99:101]-node.example.com
    

对于服务器的话 因为之前我们有写在 ~/.ssh/config 大概一个config长这样:

Host Server3
    HostName xxx # ip or hostnames
    IdentityFile ~/.ssh/id_rsa
    Port xxx # 可连通的Port节点
    User xxx # node节点上登录的用户名

Host Server10
    HostName xxx # ip or hostnames
    IdentityFile ~/.ssh/id_rsa
    Port xxx # 可连通的Port节点
    User xxx # node节点上登录的用户名
  • 如果是给是我之前那样的设置的话 我会把 ``/etc/ansible/hosts` 写成这样:

    [local]
    localhost ansible_connection=local ansible_python_interpreter=/usr/bin/python3
    
    [compute]
    Server3
    Server5
    Server8
    Server4
    Server12
    Server13
    Server11
    
    [cluster:children]
    compute
    
    [cluster:vars]
    ansible_python_interpreter=/usr/bin/python3
    

打印 graph

然后 设置完成后,保存退出,在终端输入:

ansible-inventory --graph --vars

比如我的设置完 服务器的所有节点:

运行 command

首先我们测试几个点,然后再仔细解释一下 即更进阶的版本

小试一下 连通这些节点 :

ansible cluster -m ping

可以看到 server3 不能被连通 其他的都可

那么我们再试一下 读取所有服务器上的的gpu 状态

ansible cluster -m command -a "nvidia-smi"

好了,是时候要解释一下了 【再次提醒 --help 是个好东西】:

  • ansible 使用的工具名字

  • cluster 我对host里面的命名,比如上面举例 ansible-inventory --graph --vars 这个运行完后 能看到 graph是从cluster 这个名字打开的,所以 也就是在cluster组的所有节点上都运行

  • -m command -m 是 ansible的参数,从第一次安装完 我们打印了 --help 里面有提到这个

    • m MODULE_NAME, --module-name MODULE_NAME
      Name of the action to execute (default=command)

    command 的意思就是 我自己会给指令让他运行

    -m ping 因为ping是ansible里面内置的module名字 所以 -m 带上 ping就是测试这个组的所有节点是否连通

  • -a "nvidia-smi" 一般 -a 跟着的是 -m command 或者 是没有(因为默认是command) 因为一般只有自己输入特定指令需要给这个参数

    • a MODULE_ARGS, --args MODULE_ARGS
      The action’s options in space separated k=v format: -a ‘opt1=val1 opt2=val2’

ok 随堂测试 这条指令干什么 【可以自己试试】:

ansible cluster -m command -a "nvidia-smi --query-gpu=index,gpu_name,utilization.gpu,memory.total,memory.used,temperature.gpu --format=csv,noheader,nounits"

实际上到这里 普通用户用来 看看 server的状态 就差不多了,进阶呢 就是把command -a 后面的 搞成一个yaml文件,这样就不用输入一系列长的指令了

进阶尝试

主要 适用人员 就是对node节点要干些什么,不是单纯的打印信息了;比如统一升级某个包、统一添加一个用户、统一卸载什么东西 等等等

首先介绍一下ansible 的模块

  • command:也就是上面我们介绍过了的 常见命令都可以使用,但是执行不是通过shell的 所以 < > | and & 等操作 nope

    ansible cluster -m command -a "nvidia-smi"
    
  • shell :默认/bin/sh执行,所以终端输入的命令都可以使用

    可以看到 -m 后面跟的是shell! 然后我们还接了一个 &&

    ansible cluster -m shell -a "nvidia-smi && ls | grep config"
    

    当然看到这里,确实shell 是可以把自己的scripts 先 cp 过去,然后再运行,但是呢 这样需要调用两次ansible 第一次 cp 第二次 run

    # copy 过去
    ansible cluster -m copy -a "src=/home/kin/echo_test.sh dest=/home/kin owner=kin group=kin mode=0777"
    # 然后运行
    ansible cluster -m shell -a "./home/kin/echo_test.sh"
    

    而下面介绍的scripts 和 playbook 就不需要了

  • scripts:在本地写一个脚本,在远程服务器上执行

scripts运行

首先这个 我们需要写好一个脚本,举个例子

写个echo_test.sh 就打印一下显卡和 echo Hello

#!/bin/bash
#nvidia-smi
date
hostname
echo "Hello Test ansible Here!"

然后运行:

ansible cluster -m script -a "/home/kin/echo_test.sh"

playbook 介绍

终于到大头了 看到这里还记得第一幅图的东西吗?所有的部分基本快速过了一遍 还差一个playbook! 关于ansible自己文档的介绍 在这里

  • Playbooks are automation blueprints, in YAML format 并使用它进行部署和配置节点等

那么为什么上面的script不够用呢? 可以停下想想


因为 在你运行上面scripts 的时候 没法说 node B执行这段,node B执行第二段;或者是不同的用户属性不同操作等等 【官方的答案还有几个点 感兴趣可以点上面的link;这么一看 playbook这个名字取得真不错 按照剧本 演】

好 进入正题,先给一个参考博客里的 playbooks 样子:

---
- name: Update web servers
  hosts: webservers
  remote_user: root

  tasks:
  - name: Ensure apache is at the latest version
    ansible.builtin.yum:
      name: httpd
      state: latest
  - name: Write the apache config file
    ansible.builtin.template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf

解释一下:

  • name task description 任务描述信息
  • hosts 要执行这个task的 节点组,比如我们之前一直的命名是 cluster
  • ansible.builti 这里都是使用了ansible 内置的模块功能
  • module_name module_args #需要使用的模块名字: 模块参数
  • shell 使用shell模块
---
- hosts: mongo_servers
  tasks:
  - include: roles/mongod/tasks/shards.yml

其中include 的playbook 长这样:

---
#This Playbooks adds shards to the mongos servers once everythig is added

- name: Create the file to initialize the mongod Shard
  template: src=shard_init.j2 dest=/tmp/shard_init_{{ inventory_hostname }}.js
  delegate_to: '{{ item }}'
  with_items: groups.mongos_servers

- name: Add the shard to the mongos
  shell: /usr/bin/mongo localhost:{{ mongos_port }}/admin -u admin -p {{ mongo_admin_pass }} /tmp/shard_init_{{ inventory_hostname }}.js
  delegate_to: '{{ item }}'
  with_items: groups.mongos_servers

这是官方的一个示例

是不是大概看懂了?【反正我第一次是没看懂 一堆admin 也不敢运行 所以还是 祖传!检查disk space 是不是剩余ok

- name: Disk space in local storage
  hosts: cluster
  tasks:
  - set_fact:
      mount: "{{ ansible_mounts | selectattr('mount', 'equalto', '/')  | first }}"
  - set_fact:
      size_total_gb: "{{ (mount.size_total / (1024*1024*1024)) }}"
      size_used_gb: "{{ ((mount.size_total - mount.size_available) / (1024*1024*1024)) }}"
      size_used_percent: "{{ 100 * (mount.size_total - mount.size_available) / mount.size_total }}"
  - set_fact:
      size_ok: "{{ ( (mount.size_total - mount.size_available) / mount.size_total ) < 0.80 }}"
      size_msg: "Local storage: {{ size_used_gb|float|round(1) }}/{{ size_total_gb|float|round(1) }}GB ({{ size_used_percent|float|round(1) }}%)"
  - assert:
      that: size_ok
      quiet: true
      fail_msg: "{{size_msg}}"

vim 完了 可以试一下check,这个check mode只是一个模拟 不会输入任务的output,但是是一个非常适合验证这个playbook在一个节点上 运行的一些配置管理操作【当然 我们上面只是判断一下 硬盘还有存储空间

ansible-playbook echo_local.yaml --check

如果只想在一个node上运行可以 加 --limit node_name 比如:

ansible-playbook echo_local.yaml --limit Server5

实际的运行指令很简单,直接跟yaml即可:

总结

意犹未尽?ansible 自己官方给了很多很多 examples,欢迎去探索:https://github.com/ansible/ansible-examples

然后这个 文档 真的是一个特别特别特别简单的入门 了解 尝试,也是张聪明同学第一次学的时候 边学边写的… 有错误很正常 或者是随时间 万一指令不对了 过时了 大家都看官方文档为主哈


赠人点赞 手有余香 😆;正向回馈 才能更好开放记录 hhh

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/365762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java基础学习 day44(多态的优点和劣势)

1. 多态的优势 在多态形式下&#xff0c;右边对象可以实现解耦合&#xff08;即之后的代码与右边的子类对象不绑定&#xff0c;在更改子类对象后&#xff0c;之后的代码仍可以使用&#xff09;&#xff0c;便于扩展和维护在定义方法的时候&#xff0c;使用父类型作为参数&…

北京/东莞/广州/深圳2023年上半年软考(中/高级)报名>>>

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…

TCP/IP体系结构、Socket、进程PID、端口Port

计算机网络小结 一、TCP/IP体系结构 首先OSI参考模型&#xff0c;OSI将网络分为七层&#xff0c;自下而上分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 TCP/IP体系结构则将网络分为四层&#xff0c;自下而上分别是网络接口层、网络层、传输层、应用…

(二十五)、实现评论功能(5)【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1&#xff0c;实现二级回复的入库操作 1.1 两个子组件&#xff08;comment-item和comment-frame&#xff09;与父组件reply之间的属性传值 comment-item&#xff1a; props: {item: {type: Object,default () {return {}}}},comment-frame&#xff1a; props: {commentObj: {…

LoRaWAN模块在车辆跟踪定位中的应用

目前 GPS已经在资产的管理中得到了越来越多的运用&#xff0c;如车辆跟踪、车队跟踪、资产监控等&#xff1b;人员跟踪&#xff0c;宠物跟踪&#xff0c;等等。在所有追踪装置中&#xff0c;最重要的是它的电池期望和监视距离。鉴于 LoRaWAN的功率消耗很小&#xff0c;而且能在…

Allegro如何快速检查走线是否跨分割操作指导

Allegro如何快速检查走线是否跨分割操作指导 在做PCB设计的时候,信号线跨分割的情况需要尽量避免,尤其是信号速率较高的情况,Allegro可以快速的检查PCB上哪个位置跨分割了,并且以高亮的形式报出来,类似下图 TOP层走线跨了L2层参考层空洞, 如何检查,具体操作步骤如下 点…

ArkUI实战,自定义饼状图组件PieChart

本节笔者带领读者实现一个饼状图 PieChart 组件&#xff0c;该组件是根据笔者之前封装的 MiniCanvas 实现的&#xff0c; PieChart 的最终演示效果如下图所示&#xff1a; 饼状图实现的拆分 根据上图的样式效果&#xff0c;实现一个饼状图&#xff0c;实质就是绘制一个个的实…

如何保护 IP 地址的隐私问题

是不是只有运营商才能查到某个人的住址信息呢&#xff1f;在大数据时代的今天&#xff0c;各种互联网应用收集了大量的数据信息&#xff0c;它们其实也可以根据这些信息&#xff0c;推断出某个人的大致地址位置。例如百度地图会一直用 App SDK 以及网页的方式记录 IP 和地址位置…

MySQL-redo log和undo log

什么是事务 事务是由数据库中一系列的访问和更新组成的逻辑执行单元 事务的逻辑单元中可以是一条SQL语句&#xff0c;也可以是一段SQL逻辑&#xff0c;这段逻辑要么全部执行成功&#xff0c;要么全部执行失败 举个最常见的例子&#xff0c;你早上出去买早餐&#xff0c;支付…

位运算(C/C++)

1. 基础知识 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如&#xff0c;and运算本来是一个逻辑运算符&#xff0c;但整数与整数之间也可以进行and运算。举个例子&#xff0c;6的二进制是110&#xff0c;11的二…

Python概述 基础语法 判断 循环

Python概述常用快捷键第二章-Python基础语法01-字面量02-注释03-变量04-数据类型05-数据类型转换06-标识符07-运算符08-字符串的三种定义方式09-字符串的拼接10-字符串格式化11-字符串格式化的精度控制 12-字符串格式化-快速写法13-对表达式进行格式化14-字符串格式化练习题讲解…

【Jmeter】ForEach控制器

一、什么是ForEach控制器 ForEach控制器是遍历某个数组读取不同的变量值&#xff0c;来控制其下的采样器或控制器执行一次或多次。而这个数组可以是用户自定义变量&#xff0c;也可以是从前面接口请求中提取到需要的数据&#xff0c;然后进行遍历循环。 二、ForEach控制器相关…

【概念辨析】二维数组传参的几种可能性

一、二维数组传参竟然不是用二级指针进行接收&#xff1f; 今天进行再一次的二级指针学习时&#xff0c;发现了一条以前没怎么注意过的知识点&#xff1a;二维数组进行传参只能用二维数组&#xff08;不能省略列&#xff09;进行接收或者是数组指针。 问题复现代码如下&#xf…

深度卷积对抗神经网络 进阶 第三部分 GANs Unpaired Translation with Cycle GAN 模型

非配对的图像转换应用 Unpaired Image-to-Image Translation Unpaired image-to-image translation 主要用于学习两组图像之间的对应关系&#xff0c;检查和寻找两堆数据中的共同内容&#xff08;content&#xff09;以及每堆独有的特点&#xff08;style&#xff09;。而这个…

FinClip 的 2022 与 2023

相比往年&#xff0c;今年复盘去年与展望新年的文章来的稍慢一点。不过也希望能够借这篇文章&#xff0c;和关注 FinClip 的用户朋友们一起聊聊&#xff0c;我们在去年和今年的想法与计划。 2022 在过去的一年中&#xff0c;我们的身边发生了很多事情&#xff0c;这些事情在不…

英语二-电子邮件邀请短文写作

1. 邮件模板 Dear 邀请人, Hope you have a great day. I am writing this email to invite you to attend 主题. Please kindly find the following information for your reference: Time: 时间 Address: 地点 We hope that nothing will prevent you from coming, as…

如何轻松学习Python数据分析?

今天这篇文章来聊聊如何轻松学习『Python数据分析』&#xff0c;我会以一个数据分析师的角度去聊聊做数据分析到底有没有必要学习编程、学习Python&#xff0c;如果有必要&#xff0c;又该如何学习才能做到毫不费力。 1.实际的工作 如果你是一名数据分析师&#xff0c;我相信你…

【Linux】环境变量与进程优先级

文章目录&#x1f3aa; 进程优先级&#x1f680;1.孤儿进程&#x1f680;2.优先级查看&#x1f680;3.优先级修改&#x1f3aa; 环境变量&#x1f680;1.常见环境变量&#x1f680;2.环境变量获取&#x1f680;3.main中的命令行参数&#x1f3aa; 进程优先级 每个进程都有相应…

Idea修改Git账号及密码的方法

IDEA修改git账号及密码的方法&#xff1a;1、file->settings->passwords2、重启IDEA3、执行一次提交或更新当执行提交或更新之后&#xff0c;idea会自动提示输入账号、密码&#xff0c;如下&#xff1a;4、以上如果还修改不了&#xff0c;请尝试如下方式解决办法&#xf…

一文揭晓:手机号码归属地api的作用是什么?

随着手机的普及&#xff0c;手机号码的归属地已经成为很多网站和App中调用的重要数据资源。而手机号码归属地API可以帮助开发者快速获取手机号码归属地信息。目前&#xff0c;这种API已经被广泛地使用&#xff0c;用于各种不同的应用场景。这对于用户及开发者来说是非常重要的&…