基于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 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...