基于ansible初始化linux服务器基础环境。
大家好,今天我要和大家分享一个关于搭建centos环境的新方法。
以前我们经常会看到一些文章介绍如何搭建centos环境,但很多时候都会出现一些问题。不过现在有了一种新的方法,就是使用ansible脚本来实现。
虽然这种方法仅适用于centos7,但只要稍作修改就可以应用到其他的环境中。使用ansible脚本可以让搭建环境更加简单、快速、稳定。
GIT 项目访问地址
https://gitee.com/haofeng82/basic-host-machine--init.git
目录
介绍
软件架构
安装教程
使用说明
初始化操作用户。
2. 主机基本功能初始化。
3.为机器设置host映射。
可能存在的问题
脚本摘要
1 初始化操作账户
2 初始化centos系统
3 安装docker
4 设置hosts映射
GIT 项目访问地址
介绍
这是一套ansbile脚本,实现了始化基于centos7系统的服务器主机基础环境的功能。 目前仅用于测试和教学环境使用,并仅保证centos77版本有效。
软件架构
软件基于ansible脚本对服务器进行初初始化工作,主要工作如下: 1 增加ops做操作账户,并为其增加ssh证书登录,此用户可以切换至root。 2 并且禁用了root登录。所有需要root的行为,都会通过ops 进行become 3 禁用了防火墙等功能。统一使用外部防火墙。 4 安装了必要的系统包,并进行了系统优化。 5 安装了docker,因为后续的一些其他项目的安装,会用到docker。 6 提供了统一设置主机host的功能
安装教程
1需要找一台服务器,安装ansible环境,然后把当前项目复制到相应的目录下。
2依据后面的使用步骤执行脚本即可。 PS:主机目录文件需要自行进行修改。 证书使用了预先生成好的证书,也可以自行生成配置。
使用说明
-
初始化操作用户。
当拿到一台新机器时,首先需要对其进行用户限制。 前提:将主机设置为可以使用root登录。密码统一初始化为XXX.
主要操作如下: 1 禁用root的远程登录。 2 禁用密码登录。 3 创建operator操作用户,及operator组。并为其设置登录密码、上传登录共公钥。
上面的所有操作,均在init-user角色中,并通过下面的脚本调用
上传整个目录到ansible主机的/ansible/basic-host-machine目录下,并对host文件中的to-init-user-host分组中的主机ip进行设置。指定为要操作的机器。 cd /ansible/basic-host-machine cp -rf /ansible/basic-host-machine/.ssh /root ansible-playbook -vvv --check -i hosts/nat/host-basic init-basic-host-user.yml ansible-playbook -vvv -i hosts/nat/host-basic init-basic-host-user.yml
2. 主机基本功能初始化。
此步骤必须依赖第一步 在执行完初始化用户之后。会以operator用户进行登录。 此时的root用户已经被禁用掉了。
上传整个目录到ansible主机的/ansible/basic-host-machine目录下,并对host文件中的to-init-env-host分组中的主机ip进行设置。指定为要操作的机器。
主要工作包括: 安装必要的工具包 开启或者关闭防火墙以及selinux 安装docker环境
cd /ansible/basic-host-machine
ansible-playbook -vvv --check -i hosts/nat/host-basic init-basic-host-env.yml ansible-playbook -vvv -i hosts/nat/host-basic init-basic-host-env.yml
3.为机器设置host映射。
此步骤必须依赖第一步 统一对主机的hosts进行配置
上传整个目录到ansible主机的/ansible/basic-host-machine目录下,并对host文件中的to-init-user-host分组中的主机ip进行设置。指定为要操作的机器。 cd /ansible/basic-host-machine
ansible-playbook -vvv --check -i hosts/nat/host-basic set-host-mapping
ansible-playbook -vvv -i hosts/nat/host-basic set-host-mapping.yml
可能存在的问题
变量的配置还是有一些不合适的地方。需要再进行修改。目前仅是提交了初始版本。
代码放到了git上,需要的小伙伴直接拿来用就好。如果有不严谨的地方,也希望能够指正出来。
脚本摘要
1 初始化操作账户
---
#关闭防火墙
- name: close fire wall
shell: "{{ item}}"
with_items:
- "systemctl stop firewalld.service"
- "systemctl disable firewalld.service"
#关闭selinux
- name: Disabled SELinux
selinux: state=disabled
#下次启动也不会再起selinux
- name: set selinux disabled
replace:
path: /etc/selinux/config
regexp: '^SELINUX=enforcing'
replace: 'SELINUX=disabled'
##创建用户分组
- name: Create group
group: name={{group}} state=present
when: add_user
#当add_user变量为true,创建用户。此用户用于运行项目。
- name: Add sudo user
user:
name: "{{ user }}"
password: "{{ operation_user_password }}"
state: present
when: add_user
#将证书拷贝至远程机器,用户为root,这一步是为了能够通过证书ssh访问远程主机
- name: install ssh key
authorized_key: user={{user}}
key="{{ lookup('file','/root/.ssh/id_rsa.pub')}}"
state=present
#将用户临时切换到为sudo root用户时,设置为不需要密码。
- name: Add configured user accounts to passwordless sudoers.
lineinfile: >
dest=/etc/sudoers
regexp='^{{ user }}'
line='{{ user }} ALL=(ALL) NOPASSWD: ALL'
state=present
validate='visudo -cf %s'
2 初始化centos系统
---
#配置主机名
- name: Configure hostname
hostname:
name: "{{ host_name }}"
- name: install basic tools1
yum:
name: "{{ item }}"
state: present
with_items:
- "wget"
#更换yum阿里数据源
- name: change yum source to ali
shell: "{{ item}}"
with_items:
- "mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup"
- "wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo"
- "yum clean all"
- "yum makecache"
#安装基础工具
#- name: update yum
# shell: yum -y update
- name: install basic tools2
yum:
name: "{{ item }}"
state: present
with_items:
- "wget"
- "curl"
- "unzip"
- "vim"
- "net-tools"
- "nfs-utils"
- "pcre-devel"
- "openssl-devel"
- "gcc"
- "perl"
- "perl-devel"
#复制cronolog rpm安装文件到服务器
- name: copy cronolog rpm install file
copy:
src: "{{ playbook_dir }}/data/archive/cronolog-1.6.2-14.el7.x86_64.rpm"
dest: "/tools/cronolog/"
# 安装 cronolog
- name: install cronolog
shell: "{{ item }}"
with_items:
- "rpm -ivh /tools/cronolog//cronolog-1.6.2-14.el7.x86_64.rpm"
ignore_errors: True
#临时修改linux文件句柄数(用户级别)
- name: modify linux user ulimit temp
shell: "{{ item}}"
with_items:
- "ulimit -SHn 65535"
# 永久修改 linux user soft limit
- name: modify linux root user soft ulimit per
lineinfile: >
dest=/etc/security/limits.conf
regexp='^root soft nofile'
line='root soft nofile 65535'
state=present
# 永久修改 linux user hard limit
- name: modify linux user ulimit per
lineinfile: >
dest=/etc/security/limits.conf
regexp='^root hard nofile'
line='root hard nofile 65535'
state=present
# 永久修改 linux user soft limit
- name: modify linux ops user soft ulimit per
lineinfile: >
dest=/etc/security/limits.conf
regexp='^ops soft nofile'
line='ops soft nofile 65535'
state=present
# 永久修改 linux user hard limit
- name: modify linux ops user ulimit per
lineinfile: >
dest=/etc/security/limits.conf
regexp='^ops hard nofile'
line='ops hard nofile 65535'
state=present
# 上传 linux system 配置文件,优化系统性能参数
- name: upload linux system ulimit temp
shell: "echo 655350 > /proc/sys/fs/file-max"
- name: Copy sysctl.conf to server
template:
src: sysctl.conf.j2
dest: /etc/sysctl.conf
mode: 0740
# 重启sysctl
- name: restart sysctl
shell: "sysctl -p"
#将证书复制到用户的.ssh目录下,并更改权限。
- name: copy auth public key to host file
copy:
src: "/root/.ssh/id_rsa.pub"
dest: "/home/{{ user }}/.ssh/"
owner: "{{ user }}"
group: "{{ group }}"
#私钥的权限一定不要别的用户和组能够读取到
- name: copy auth private key to host file
copy:
src: "/root/.ssh/id_rsa"
dest: "/home/{{ user }}/.ssh/"
owner: "{{ user }}"
group: "{{ group }}"
mode: 0600
#更新sshd文件配置,更改sshd端口,是否开启sshd_use_dns,是否开启sshd_gssapi_authentication是否开启,
#设置sshd协议 2,禁止root登录(先不设置)是否开启密码登录(先不禁止密码登录)
- name: Update SSH configuration to be standard setting.
lineinfile: >
dest={{ sshd_config_path }}
regexp="{{ item.regexp }}"
line="{{ item.line }}"
state=present
with_items:
- { regexp: "^#?Port", line: "Port {{ sshd_port }}" }
- { regexp: "^#?UseDNS", line: "UseDNS {{ sshd_use_dns }}" }
- { regexp: "^GSSAPIAuthentication", line: "GSSAPIAuthentication {{ sshd_gssapi_authentication}}" }
- { regexp: "^#?Protocol", line: "Protocol {{ sshd_protocol }}" }
- { regexp: "^#?PermitRootLogin", line: "PermitRootLogin {{ sshd_permit_root_login }}" }
- { regexp: "^PasswordAuthentication", line: "PasswordAuthentication {{ sshd_password_authentication }}" }
- { regexp: "^#?RSAAuthentication", line: "RSAAuthentication yes" }
- { regexp: "^#?PubkeyAuthentication", line: "PubkeyAuthentication yes" }
- { regexp: "^#?RhostsRSAAuthentication", line: "RhostsRSAAuthentication yes" }
notify: restart sshd
#更新sshd文件配置,更改sshd端口,是否开启sshd_use_dns,是否开启sshd_gssapi_authentication是否开启,
#设置sshd协议 2,禁止root登录(先不设置)是否开启密码登录(先不禁止密码登录)
- name: Update SSH configuration to be standard setting.
lineinfile: >
dest={{ ssh_config_path }}
regexp="{{ item.regexp }}"
line="{{ item.line }}"
state=present
with_items:
- { regexp: "^#?StrictHostKeyChecking", line: "StrictHostKeyChecking no" }
notify: restart sshd
3 安装docker
---
#配置主机名
#https://www.jianshu.com/p/b4a6239712bf
#还需要更新docker镜像源!!
- name: Configure hostname
hostname:
name: "{{ host_name }}"
- name: install yum-utils
yum: name=yum-utils state=present
ignore_errors: True
- name: add docker repo
shell: yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
ignore_errors: True
- name: install docer-ce
yum:
name: docker-ce
state: present
ignore_errors: True
- name: install docker-ce-cli
yum:
name: docker-ce-cli
state: present
ignore_errors: True
- name: install containerd.io
yum:
name: containerd.io
state: present
ignore_errors: True
- name: 创建docker目录
shell: mkdir -p /etc/docker/
- name: config mirro
copy: src=~/docker-daemon.json dest=/etc/docker/daemon.json
tags: configmirro
- name: start enable docker
service: name=docker state=started enabled=true
- name: restrat
shell: sudo systemctl daemon-reload && sudo systemctl restart docker
tags: restart
#必须在ansible主机之上,的/data/archive下存在docker-compose文件
- name: Copy docker compose file
copy:
src: "{{ playbook_dir }}/data/archive/docker-compose"
dest: "/usr/local/bin/docker-compose"
- name: install docker compose
shell: "{{ item }}"
with_items:
- "sudo chmod +x /usr/local/bin/docker-compose"
- "sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose"
- "sudo docker-compose --version"
ignore_errors: True
4 设置hosts映射
#更新ip-host映射
- name: update-ip-host-mapping
template:
src: host-file.j2
dest: /etc/hosts
mode: 0644
GIT 项目访问地址
https://gitee.com/haofeng82/basic-host-machine--init.git
大家可以在评论区留言,分享自己使用ansible脚本搭建环境的经验和技巧,让我们一起交流吧!记得点赞和分享哦!
相关文章:
基于ansible初始化linux服务器基础环境。
大家好,今天我要和大家分享一个关于搭建centos环境的新方法。 以前我们经常会看到一些文章介绍如何搭建centos环境,但很多时候都会出现一些问题。不过现在有了一种新的方法,就是使用ansible脚本来实现。 虽然这种方法仅适用于centos7&#…...
leetcode-数据库题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 175. 组合两个表176. 第二高的薪水177. 第N高的薪水178. 分数排名181. 超过经理收入的员工182. 查找重复的电子邮箱183. 从不订购的客户 175. 组合两个表 select p…...

[元来学NVMe协议] NVMe IO 指令集(NVM 指令集)| Flush 命令
声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 内容摘要 前言 NVMe2.0 定义的三类命令集: 管理命令集、IO命令集、Fabrics命令集 Admin Command Set (管理命令集):用于控制器的管理,如创建/销毁IO提交队列…...

信息的相关性和冗余度:信息在整个文明中的作用
文章目录 I 古埃及的象形文字1.1 罗塞塔石碑1.2 古埃及文字音节和希腊字母的对应表1.3 破解古埃及文字 I 古埃及的象形文字 1.1 罗塞塔石碑 这个石碑是在公元前196年埃及国王托勒密五世加冕一周年的诏书。 在此前大约一百年,埃及已经被来自希腊北方城邦的亚历山大…...

python数据结构与算法-动态规划(最长公共子序列)
一、最长公共子序列问题 1、问题概念 一个序列的子序列是在该序列中删去若干元素后得 到的序列。 例如:"ABCD”和“BDF”都是“ABCDEFG”的子序列。 最长公共子序列(LCS) 问题: 给定两个序列X和Y,求X和Y长度最大的公共子字列。 例:X"ABBCBDE”…...
Java版企业电子招投标系统源码 Spring Cloud+Spring Boot 电子招标采购系统功能清单
一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点:对草稿进行编辑&#x…...

【c语言】函数的基本概念 | 函数堆栈调用原理
创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…...

Vue.prototype 详解及使用
前言: 我们可能会在很多组件里用到数据/实用工具,但是不想污染全局作用域。这种情况下,可以通过在原型上定义它们使其在每个 Vue 的实例中可用。 1. 基本示例 在main.js中添加一个变量到 Vue.prototype Vue.prototype.$appName My App这…...

音视频八股文(3)--ffmpeg常见命令(2)
07-ffplay命令播放媒体 播放本地文件 播放本地 MP4 视频文件 test.mp4 的命令,从第 2 秒位置开始播放,播放时长为 10 秒,并且在窗口标题中显示 “test time”: ffplay -window_title "test time" -ss 2 -t 10 -autoe…...

使用bert4keras出现的问题(Process finished with exit code -1073741819 (0xC0000005))
1、环境 python 3.7.12 tensorflow 1.15 keras 2.3.1 bert4keras 0.9.7 protobuf 3.19.0 numpy 1.16.5 2、出现问题 numpy版本不兼容问题所以你就直接按照我的版本就可以了(numpy 1.16.5) Process finished with exit code -1073741819 (0xC0000005) …...

python协程实战
协程简介 协程(Coroutine)又称微线程、纤程,协程不是进程或线程,其执行过程类似于 Python 函数调用,Python 的 asyncio 模块实现的异步IO编程框架中,协程是对使用 async 关键字定义的异步函数的调用; 一个进程包含多个线程,类似…...

【论文笔记】VideoGPT: Video Generation using VQ-VAE and Transformers
论文标题:VideoGPT: Video Generation using VQ-VAE and Transformers 论文代码:https://wilson1yan. github.io/videogpt/index.html. 论文链接:https://arxiv.org/abs/2104.10157 发表时间: 2021年9月 Abstract 作者提出了…...

scala之基础面向对象
scala 既是面向对象 也是函数式编程 从Java 发展而来,依赖JVM环境 一、 scala 在linux中运行 scala 模式中直接编写运行 scala文件,load执行 scala编译程序 编译 运行 scala java 二、scala 数据类型 基础数据类型 val 不可变变量 函数式编程 …...
Qt5.12实战之多线程编程概念
1.为什么要使用多线程? a. 基于线程,同时处理多个任务,软件响应更灵敏 b.充分利用CPU的多核心功能增加应用运行效率 c.多线程在同一进程间使用共享通信更加高效 d.多个线程之间进行切换比多个进程之间进行切换,线程开销更少. 2.操作系统与进程关系 a. MS-DOS系统 属于单进程…...

格式化数据恢复怎么做?超实用的3种方法在这!
案例:格式化数据怎么恢复 【我的电脑前段时间中病毒了,无奈之下我只能将其格式化,但是很多重要的文件和图片之类的也一起被删除了,有什么方法可以恢复这些格式化的数据吗?非常着急!】 格式化数据恢复&…...

【Java|golang】1105. 填充书架---动态规划
给定一个数组 books ,其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。 按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。 先选几本书放在书架上(它们的厚度之和小于等于书架的宽度 shelfWidt…...
linux基础命令
linux基础命令 一、linux命令 熟悉账务linux命令对运维的好处是巨大的,只有熟悉了命令咱们在运维的操作上才能如鱼得水。 系统信息 arch #显示机器的处理器架构(1) uname -m #显示机器的处理器架构(2) uname -r #显示正在使用的内核版本 dmidecode -q …...

【三十天精通Vue 3】 第十八天 Vue 3的国际化详解
✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 引言一、Vue 3 国际化概述1.1 国际化的概念1.2 国际化的作用1.3 V…...

02 - 学会提问
学会提问 一、引言 1.1 GPT简介 GPT(Generative Pre-trained Transformer)是一种基于Transformer架构的大型预训练语言模型。 凭借其强大的文本生成、理解和处理能力,GPT已在诸如自然语言处理、机器翻译、文本摘要等多个领域取得了显著的…...
Java经典的Main方法面试题
mian方法是做什么用的? main方法是Java程序的入口方法,JVM在运行的时候会首先查找main方法不用main方法如何运行一个类? 不行,没有main方法我们不能运行Java类 在Java7之前,你可以通过使用静态初始化运行Java类。但是&…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...

数据分析六部曲?
引言 上一章我们说到了数据分析六部曲,何谓六部曲呢? 其实啊,数据分析没那么难,只要掌握了下面这六个步骤,也就是数据分析六部曲,就算你是个啥都不懂的小白,也能慢慢上手做数据分析啦。 第一…...