news 2026/4/16 1:31:16

ansible配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ansible配置

ansible 环境准备

ansible 架构

  • 控制节点:下发指令或文件到受控制节点。
  • 受控制节点:接受控制节点发过来的指令,并执行。

ansible 工作原理

ansible控制节点通过ssh协议将python 模块推送到受控制节点受控制节点使用python执行python模块进行相应的配置。

ansible 环境准备

实验环境

10.1.8.10 controller.sjz.cloud controller10.1.8.11 server1.sjz.cloud server110.1.8.12 server2.sjz.cloud server210.1.8.13 server3.sjz.cloud server310.1.8.14 server4.sjz.cloud server4

准备虚拟机模版

准备1台干净的centos 7 虚拟机。

注意:模版虚拟机的CPU和内存的配置,建议设置为1CPU和2G内存。

开发脚本sethost:

  • 不加参数执行sethost,则提示命令使用方法。
  • 加参数执行sethost,则第一个参数范围是10-14。超出范围也提示命令使用方法。
  • 正常执行示例:sethost 10,这设置正确的主机名和IP地址。
[root@centos ~13:34:31]# vim /usr/local/bin/sethost#!/bin/bash# test root user((UID!=0))&&echo'Please run as root.'&&exit1usage="Usage:$010-14"# test args number(($#!=1))&&echo$usage&&exit2# 根据实际情况修改网卡名和域名con_name=ens33domain_name=sjz.cloudhost_id=$1if((host_id==10));thenHOSTNAME=controller.${domain_name}elif((11<=host_id&&host_id<=14));thenHOSTNAME=server$[host_id-10].${domain_name}elseecho$usageexit3fihostnamectl set-hostname$HOSTNAMEnmcli connection modify${con_name}ipv4.addresses10.1.8.${host_id}/24 nmcli connection up${con_name}hostnameip-braddress[root@centos ~13:34:31]# chmod +x /usr/local/bin/sethost

关机打快照,快照名为ansible。

克隆虚拟机

基于模版虚拟机快照ansible,克隆出其他虚拟机,并使用sethost脚本设置主机名和IP地址。

以server1为例:

[root@centos ~13:34:31]# sethost 11

配置 ansible 基础环境

在模版虚拟机上配置/etc/hosts,添加ansible主机清单

[root@deploy ~14:51:11]# vim /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6################# ansible ####################10.1.8.10 controller.sjz.cloud controller10.1.8.11 server1.sjz.cloud server110.1.8.12 server2.sjz.cloud server210.1.8.13 server3.sjz.cloud server310.1.8.14 server4.sjz.cloud server4################# ansible ####################

配置免密登录ansible节点:

[root@deploy ~14:52:58]# ssh-keygen -t rsa -N "" -f .ssh/id_rsa[root@deploy ~14:54:39]# \forhostincontroller server1 server2 server3 server4dosshpass-p123ssh-copy-id root@$hostdone[root@deploy ~14:56:02]#forhostincontroller server1 server2 server3 server4dosshroot@$host'hostname;ip -br a show ens33;echo'done# 输出内容如下:controller.sjz.cloud ens33 UP10.1.8.10/24 fe80::20c:29ff:fe14:2f8b/64 server1.sjz.cloud ens33 UP10.1.8.11/24 fe80::20c:29ff:fe6a:559b/64 server2.sjz.cloud ens33 UP10.1.8.12/24 fe80::20c:29ff:feec:ac41/64 server3.sjz.cloud ens33 UP10.1.8.13/24 fe80::20c:29ff:fe19:59c1/64 server4.sjz.cloud ens33 UP10.1.8.14/24 fe80::20c:29ff:feaa:4763/64

在模版虚拟机上开发脚本weihu,用来集中管理其他机器。

  • weihu cmd command,将会在ansible 5台设备上执行command。
  • weihu copy src dest,将模版虚拟机上的src文件复制到ansible 5台设备dest位置。
[root@deploy ~14:49:42]# vim /usr/local/bin/weihu#!/bin/bashfunctionusage(){echo"Usage: weihu cmd COMMAND, 在集群中所有的机器上执行对应COMMAND命令"echo"Usage: weihu copy source target,将本地source文件,推送到集群中所有的机器上"exit}action=$1HOSTLIST='controller server1 server2 server3 server4'(($#<=1))&&usagecase"$action"in"cmd")# 删除参数1shiftCOMMAND="$*"forhostin$HOSTLISTdosshroot@$host"$COMMAND"done;;"copy")# 删除参数1shiftforhostin$HOSTLISTdonum=$#case$numin2)scp-r$1root@$host:$2;;#[3-9]|[1-9][0-9])[3-9])last=$(echo$*|awk'{print $NF}')args_exclude_last=$(echo$*|sed"s#$last##")scp-r${args_exclude_last}root@$host:${last};;*)usageesacdone;;*)usage;;esac[root@deploy ~14:50:49]# chmod +x /usr/local/bin/weihu

测试维护脚本

root@deploy ~14:56:09]# weihu cmd hostnamecontroller.sjz.cloud server1.sjz.cloud server2.sjz.cloud server3.sjz.cloud server4.sjz.cloud[root@deploy ~14:56:47]# weihu copy /etc/hosts /etc/hostshosts100%449222.1KB/s 00:00 hosts100%449245.5KB/s 00:00 hosts100%449275.8KB/s 00:00 hosts100%449351.0KB/s 00:00 hosts100%449317.4KB/s 00:00[root@deploy ~14:57:33]# weihu cmd cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6################# ansible ####################10.1.8.10 controller.sjz.cloud controller10.1.8.11 server1.sjz.cloud server110.1.8.12 server2.sjz.cloud server210.1.8.13 server3.sjz.cloud server310.1.8.14 server4.sjz.cloud server4......

准备一个专用的账户devops,用于控制节点远程登录其他节点。

[root@deploy ~15:21:59]# weihu cmd useradd devops[root@deploy ~15:36:17]# weihu cmd id devopsuid=1001(devops)gid=1001(devops)groups=1001(devops)uid=1001(devops)gid=1001(devops)groups=1001(devops)uid=1001(devops)gid=1001(devops)groups=1001(devops)uid=1001(devops)gid=1001(devops)groups=1001(devops)uid=1001(devops)gid=1001(devops)groups=1001(devops)[root@deploy ~15:36:22]# weihu cmd 'echo 123 | passwd --stdin devops'[root@deploy ~15:37:41]# sshpass -p 123 ssh devops@server1 iduid=1001(devops)gid=1001(devops)groups=1001(devops)# 配置devops账户,免密提权为root[root@deploy ~15:39:17]# weihu cmd "echo 'devops ALL=(ALL)NOPASSWD: ALL' > /etc/sudoers.d/devops"

配置控制节点使用devops账户免密登录所有ansible节点。

[root@deploy ~15:47:55]# sshpass -p123 ssh devops@controller 'ssh-keygen -t rsa -N "" -f .ssh/id_rsa'[root@deploy ~15:48:30]# sshpass -p123 ssh devops@controller 'for host in controller server1 server2 server3 server4;do sshpass -p123 ssh-copy-id devops@$host;done'# 验证控制节点免密登录其他节点[devops@controller ~15:50:01]$forhostincontroller server1 server2 server3 server4;dosshdevops@$hostid;doneuid=1001(devops)gid=1001(devops)groups=1001(devops)uid=1001(devops)gid=1001(devops)groups=1001(devops)uid=1001(devops)gid=1001(devops)groups=1001(devops)uid=1001(devops)gid=1001(devops)groups=1001(devops)uid=1001(devops)gid=1001(devops)groups=1001(devops)[devops@controller ~15:50:12]$forhostincontroller server1 server2 server3 server4;dosshdevops@$hostsudoid;doneuid=0(root)gid=0(root)groups=0(root)uid=0(root)gid=0(root)groups=0(root)uid=0(root)gid=0(root)groups=0(root)uid=0(root)gid=0(root)groups=0(root)uid=0(root)gid=0(root)groups=0(root)

ansible 配置

部署 ansible软件

控制节点

[devops@controller ~16:31:42]$sudoyuminstall-yansible

受管理节点

[root@deploy ~16:36:44]# weihu cmd yum install -y python

配置主机清单

ansible管理的主机信息要保存到一个文件中,这个文件称之为主机清单(inventory)。

[devops@controller ~16:33:11]$mkdiransible[devops@controller ~16:38:45]$cdansible/[devops@controller ansible16:38:47]$viminventory controller server1 server2 server3 server4[devops@controller ansible16:43:15]$ ansible-iinventory-mcommand-a'id'server1 server1|CHANGED|rc=0>>uid=1001(devops)gid=1001(devops)groups=1001(devops)# 参数说明:# -i inventory,主机清单位置# -m command,使用命令模块# -a 'hostname',模块对应的具体参数# server1,针对哪个机器操作[devops@controller ansible16:43:41]$ ansible-iinventory-mcommand-a'id'-bserver1 server1|CHANGED|rc=0>>uid=0(root)gid=0(root)groups=0(root)# -b 提权为root操作# 使用user模块管理用户[devops@controller ansible16:43:00]$ ansible-iinventory-muser-a'name=zhangsan state=present'-bserver1 server1|CHANGED=>{"ansible_facts":{"discovered_interpreter_python":"/usr/bin/python"},"changed":true,"comment":"","create_home":true,"group":1002,"home":"/home/zhangsan","name":"zhangsan","shell":"/bin/bash","state":"present","system":false,"uid":1002}[devops@controller ansible16:43:46]$ ansible-iinventory-mcommand-a'id zhangsan'server1 server1|CHANGED|rc=0>>uid=1002(zhangsan)gid=1002(zhangsan)groups=1002(zhangsan)# 删除用户[devops@controller ansible16:44:33]$ ansible-iinventory-muser-a'name=zhangsan state=absent remove=yes'-bserver1 server1|CHANGED=>{"ansible_facts":{"discovered_interpreter_python":"/usr/bin/python"},"changed":true,"force":false,"name":"zhangsan","remove":true,"state":"absent"}[devops@controller ansible16:45:49]$ ansible-iinventory-mcommand-a'id zhangsan'server1 server1|FAILED|rc=1>>id: zhangsan: no such usernon-zeroreturncode

分组主机清单

[devops@controller ansible16:45:53]$viminventory[controllers]controller[webs]server1 server2[dbs]server3 server4

测试

# 针对webs主机组操作[devops@controller ansible16:48:55]$ ansible-iinventory-mcommand-a'hostname'-owebs server2|CHANGED|rc=0|(stdout)server2.sjz.cloud server1|CHANGED|rc=0|(stdout)server1.sjz.cloud# -o 输出内容合并为一行# all代表所有机器[devops@controller ansible16:49:03]$ ansible-iinventory-mcommand-a'hostname'-oall server2|CHANGED|rc=0|(stdout)server2.sjz.cloud server1|CHANGED|rc=0|(stdout)server1.sjz.cloud controller|CHANGED|rc=0|(stdout)controller.sjz.cloud server3|CHANGED|rc=0|(stdout)server3.sjz.cloud server4|CHANGED|rc=0|(stdout)server4.sjz.cloud# web主机组安装nginx[devops@controller ansible16:51:41]$ ansible-iinventory-myum-a'name=nginx state=present'-bwebs# web主机组卸载nginx[devops@controller ansible16:51:41]$ ansible-iinventory-myum-a'name=nginx state=absent'-bwebs

查看模块帮助

# 查看模块清单,并过滤出yum相关信息[devops@controller ansible16:53:41]$ ansible-doc-l|grepyum yum Manages packages with the `yum' package manager yum_repository Add or remove YUM repositories# 查看yum模块帮助信息[devops@controller ansible16:53:47]$ ansible-doc yum# 直接搜索EXAMPLE# 部分内容如下:EXAMPLES: - name:installthe latest version of Apache yum: name: httpd state: latest - name: ensure a list of packages installed yum: name:"{{ packages }}"vars: packages: - httpd - httpd-tools - name: remove the Apache package yum: name: httpd state: absent - name:installthe latest version of Apache from the testing repo yum: name: httpd enablerepo: testing state: present...

ansible最大的特点:

  1. 简单:只要能看懂English就行。
  2. 幂等性:多次执行,结果一致。假设第一次执行软件包未安装,则执行安装。第二次执行,则不需要做任何事情。

playbook 编写和执行

通过编写playbook,完成重复、复杂的任务。

  • ansible 命令类似于 shell 中单个命令。
  • playbook 类似于 shell 脚本。
[devops@controller ansible16:55:36]$vimdeploy_web.yaml# yaml格式起始行,一般不省略---# Playbook中第一个play# play具有属性:name,hosts,become,tasks,缩进一致# name属性,用于简要描述play- name: debploy WebSite# hosts属性,用于定义要在哪个受管理节点执行hosts: webs# tasks属性,用于描述play中任务,属性是列表格式tasks:# 第一个任务# 任务具有属性:涵name和模块名等。# name属性,用于简要描述任务- name: latest version of httpd and firewalld installed# 指明模块名,也就是要执行的任务yum:# 指定要操作的rpm包名称name:# rpm包名称是-开头的列表格式,或者逗号分隔的列表格式- httpd - firewalld# 定义软件包的状态,lastet代表升级为最新版本state: latest# 第二个任务- name: prepare index.html# copy 模块,用于将content属性值写入到目标文件copy: content:"Welcome to {{ ansible_fqdn }} WebSite!\n"dest: /var/www/html/index.html# 第三个任务- name:enableand start httpd# service模块,用于启用并启动httpd服务service: name: httpd enabled:truestate: started# 第四个任务- name:enableand start firewalld# service模块,用于启用并启动firewalld服务service: name: firewalld enabled:truestate: started# 第五个任务- name: firewalld permits access to httpdservice# firewalld,用于放行http服务firewalld: service: http permanent:truestate: enabled immediate:yes# Playbook中第二个play,-开头表示列表- name: Test WebSite hosts: localhost become: no tasks: - name: connect to intranet web server# uri模块,用于测试网站是否可以访问uri: url: http://{{item}}loop: - server1 - server2# yaml格式结束行,一般省略...# 执行剧本[devops@controller ansible17:01:40]$ ansible-playbook-iinventory-bdeploy_web.yaml
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 1:29:07

如何快速上手Ketcher:开源分子编辑器的完整入门指南

如何快速上手Ketcher&#xff1a;开源分子编辑器的完整入门指南 【免费下载链接】ketcher Web-based molecule sketcher 项目地址: https://gitcode.com/gh_mirrors/ke/ketcher 在化学研究、药物开发和生物信息学领域&#xff0c;高效绘制分子结构是科研人员的基本技能。…

作者头像 李华
网站建设 2026/4/16 1:27:34

Web前端技术第四次作业:表单实验报告

一、实验结果这次实验主要是做一个学员信息收集表&#xff0c;用的是 HTML 里的表单&#xff08;form&#xff09;。下面结合代码截图&#xff0c;分部分跟你说清楚做了啥、效果咋样。1. 整体页面结构从代码截图能看到&#xff0c;页面先搭了 HTML 的基础框架&#xff0c;声明了…

作者头像 李华
网站建设 2026/4/16 1:27:04

避坑指南:GSYVideoPlayer在Flutter混合开发中的特殊配置(v8.5.0最新版)

Flutter混合开发实战&#xff1a;GSYVideoPlayer v8.5.0深度优化指南 当Flutter应用需要嵌入高性能视频播放器时&#xff0c;GSYVideoPlayer凭借其多内核支持和丰富的功能成为首选方案。但在混合开发中&#xff0c;原生模块的集成往往会遇到包体积膨胀、性能损耗和交互冲突三大…

作者头像 李华
网站建设 2026/4/16 1:27:03

医学图像处理入门:.nii与DICOM格式的查看与分析方法

1. 医学图像处理入门&#xff1a;为什么选择.nii和DICOM格式 当你第一次接触医学图像处理时&#xff0c;可能会被各种文件格式搞得晕头转向。在众多格式中&#xff0c;.nii和DICOM是最常见的两种&#xff0c;它们就像是医学图像界的"普通话"和"方言"——各…

作者头像 李华
网站建设 2026/4/16 1:19:25

嵌入式学习day3:数组与结构体

一&#xff0c;数组1.一维数组定义如下&#xff1a;//一维数组&#xff0c;未赋值的初始化为0int arr[5]{1,2,3,4,5};//可以用循环赋值for (int i0; i<5; i) {arr[i]i1;}数组的大小数组的字节数/数组元素的字节数&#xff0c;代码如下&#xff1a;//数组的大小&#xff1a;数…

作者头像 李华
网站建设 2026/4/16 1:19:24

零知识证明系统:zk-SNARK协议的工作原理与构造

**零知识证明的魔法&#xff1a;zk-SNARK协议探秘** 在数字时代&#xff0c;隐私与验证的矛盾日益突出&#xff1a;如何在不泄露秘密的前提下证明自己知道某个信息&#xff1f;零知识证明&#xff08;ZKP&#xff09;提供了完美解决方案&#xff0c;而zk-SNARK&#xff08;零知…

作者头像 李华