Linux云计算 |【第二阶段】AUTOMATION-DAY7

devtools/2024/9/23 1:13:22/

主要内容:

Ansible项目、Ansible加密、sudo账户提权、Ansible配置文件

一、综合练习(自动化部署Web集群)

整体思路:

  • 1)创建Role,通过Role完成项目
  • 2)部署Nginx调度器
  • 3)部署2台http服务器


步骤1:部署两台后端http服务器

1)创建role角色

[root@control ansible]# mkdir ~/ansible/roles
[root@control ansible]# ansible-galaxy init ~/ansible/roles/http
- /root/ansible/roles/http was created successfully
[root@control ansible]# ls ~/ansible/roles/http
README.md  defaults  files  handlers  meta  tasks  templates  tests  vars

2)修改role配置文件,准备2台http网站及网页素材

[root@control ansible]# vim roles/http/tasks/main.yml
---
# tasks file for /root/ansible/roles/http
- name: install httpd       //任务1:调用yum模块安装httpd软件包yum:      name: httpdstate: present
- name: create index.html  //任务2:调用copy模块创建新的网页文件index.htmlcopy:content: "{{ansible_hostname}}"    //变量已被YAML识别dest: /var/www/html/index.html
- name: start httpd    //任务3:调用service模块将httpd服务启动并设置开机自启service:name: httpd.servicestate: startedenabled: yes
- name: set firewalld   //任务4:调用firewalld模块,设置防火墙规则,允许访问http服务firewalld:service: http      //或者port: 80/tcpstate: enabled     //开启防火墙规则permanent: yesimmediate: yes

解释说明:

调用 copy模块时可以在没有源文件的情况下,直接使用 content指定文件的内容,将该内容直接拷贝到被管理主机的某个文件中(如:/var/www/html/index.html),copy模块不支持在文件中有变量的拷贝,对变量不识别,但如果是在YAML文件中定义task任务,copy模块可直接识别变量;

补充:copy模块的 content选项

ansible的copy模块用来拷贝文件。通常我们将中控机上的一个已有文件,拷贝到远程服务器上(选项src、dest),用content来代替src选项的话,可以用指定内容来替代本来用src指定的文件的内容

3)编写Playbook调用role,并执行Playbook

[root@control ansible]# vim ~/ansible/web.yml
---
- hosts: webserverroles:- http    //调用并执行角色http
[root@control ansible]# ansible-playbook web.yml

步骤2:部署nginx代理服务器

1)创建role角色

[root@control ansible]# ansible-galaxy init ~/ansible/roles/proxy
- /root/ansible/roles/proxy was created successfully

2)准备代理服务器需要的素材

拷贝Nginx源码包,编写一个源码编译安装nginx的shell脚本

[root@control ansible]# cp /root/lnmp_soft/nginx-1.17.6.tar.gz ~/ansible/roles/proxy/files/
[root@control ansible]# vim ~/ansible/roles/proxy/files/nginx_install.sh
#!/bin/bash
yum -y install gcc pcre-devel openssl-devel make tar
cd /tmp
tar -xf /tmp/nginx-1.17.6.tar.gz
cd nginx-1.17.6
./configure --with-http_ssl_module
make
make install

新建一个Nginx代理服务器的配置文件模板

[root@control ansible]# vim ~/ansible/roles/proxy/files/nginx.conf
worker_processes  2;
#error_log  logs/error.log;
events {worker_connections  65535;
}
http {include       mime.types;default_type  application/octet-stream;sendfile        on;tcp_nopush     on;keepalive_timeout  65;#gzip  on;
upstream webs {server 192.168.4.13;server 192.168.4.14;
}server {listen       80;server_name  localhost;location / {proxy_pass http://webs;root   html;index  index.html index.htm;}error_page  404              /404.html;error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}

3)修改role配置文件

[root@control ansible]# vim roles/proxy/tasks/main.yml
---
- name: copy nginx-1.17.6.tar.gz to proxy.copy:src: nginx-1.17.6.tar.gzdest: /tmp/    //拷贝源码包软件,放到被控制端的/tmp/目录- name: install nginx through shell script.script: nginx_install.sh    //执行源码编译安装脚本(如果已经安装nginx,则不再执行安装脚本)args:creates: /usr/local/nginx/sbin/nginx    //判断是否有该文件- name: copy nginx.conf to destination host.copy:src: nginx.conf      //拷贝配置文件,放到被控制端的/usr/local/nginx/conf/目录dest: /usr/local/nginx/conf/nginx.conf- name: run nginx service.shell: /usr/local/nginx/sbin/nginx     //启动nginx服务args:creates: /usr/local/nginx/logs/nginx.pid   //服务启动则有进程pid,服务关闭则没有进程pid
//nginx.pid存在,说明nginx已经启动,则不再启动nginx。- name: set firewalldfirewalld:service: http      //设置防火墙规则,允许服务通过state: enabledpermanent: yesimmediate: yes

解释说明:

# args是关键词,设置script模块的参数,因script没有幂等性,通过creates参数做判断;

# creates关键词,后面跟文件名,如果creates判断文件存在的话就不再执行script模块对应的命令。

4)编写Playbook调用role,并执行Playbook

[root@control ansible]# vim proxy.yml
---
- hosts: proxyroles:- proxy
[root@control ansible]# ansible-playbook proxy.yml

二、加密敏感数据

Ansible有时需要访问一些敏感数据,如密码、Key等,使用ansible-vault对敏感数据进行加密处理;

命令:ansible-vault

选项:encrypt(加密)、decrypt(解密)、view(查看)、rekey(重置密码)


步骤1:使用ansible-vault处理敏感数据

1)加密敏感数据(encrypt)

  • 格式:ansible-vault encrypt 文件
  • 格式:ansible-vault view 文件
[root@control ansible]# echo '123456' > data.txt     //新建需加密的敏感文件
[root@control ansible]# ansible-vault encrypt data.txt    //加密文件
New Vault password:         //输入密码(123)
Confirm New Vault password:      //确认密码(123)
Encryption successful
[root@control ansible]# cat data.txt     //查看原文件
$ANSIBLE_VAULT;1.1;AES256
35326661646563356266373037353264386663653430383264656562376334316263616432323636
...
[root@control ansible]# ansible-vault view data.txt     //查看加密文件
Vault password:      //输入密码(123)
123456

2)修改密码(rekey)

格式:ansible-vault rekey 文件

[root@control ansible]# ansible-vault rekey data.txt      //修改密码
Vault password:      //输入旧密码(123)
New Vault password:    //输入新密码(321)
Confirm New Vault password:    //确认新密码
Rekey successful

3)解密文件(decrypt)

格式:ansible-vault decrypt 文件

[root@control ansible]# ansible-vault decrypt data.txt    //解密文件
Vault password:
Decryption successful
[root@control ansible]# cat data.txt
123456

4)使用密码文件(--vault-id)

加密、解密可将密码写入文件,取消交互式输入确认密码的流程

  • 命令:ansible-vault encrypt --vault-id=密码文件 文件
  • 命令:ansible-vault decrypt --vault-id=密码文件 文件
[root@control ansible]# echo "I am secret data" > data.txt     //需加密的文件
[root@control ansible]# echo '123456' > pass.txt    //加密的密码文件
[root@control ansible]# ansible-vault encrypt --vault-id=pass.txt data.txt   //加密
Encryption successful
[root@control ansible]# cat data.txt
$ANSIBLE_VAULT;1.1;AES256
33373038316234313732343861356636373463626332373631666666356238326139643036373037
...
[root@control ansible]# ansible-vault view data.txt   //查看加密文件
Vault password:
I am secret data[root@control ansible]# ansible-vault decrypt --vault-id=pass.txt data.txt  //解密
Decryption successful
[root@control ansible]# cat data.txt
I am secret data

三、配置sudo权限

了解:Ubuntu系统默认root禁用,需要对创建的用户进行sudo提权;

sudo命令(superuser or another do)让普通用户以超级管理员或其他人的身份执行命令,可修改/etc/sudoers文件,进行管理员身份授权;

sudo基本流程:管理员需要先修改/etc/sudoers文件进行授权,使普通用户以sudo的形式执行命令

修改/etc/sudoers的方法:

  • ① visudo(带语法检查,默认没有颜色提示)
  • ② vim /etc/sudoers(不带语法检查,默认有颜色提示)

格式:用户或组 主机列表=(提权身份) [NOPASSWD]:命令列表

注意:命令列表需要写绝对路径;对组授权需要在组名称前面加%;使用NOPASSWD开启无密码验证

语法格式示例:

[root@control ~]# vim /etc/sudoers
...
root          ALL=(ALL)       ALL
tom           ALL=(root)      /usr/bin/systemctl
jerry         node1=(ALL)     NOPASSWD:/usr/bin/systemctl
%wheel        ALL=(ALL)       ALL

案例:使用sudo提升普通用户的权限

  • 1)给所有被管理主机创建系统账户,账户名称为alice,密码为123456;
  • 2)修改sudo配置,让alice可以执行任何管理命令;

步骤:配置sudo提权

1)远程所有被管理主机批量创建系统账户(账户名称为alice,密码为123456)

[root@control ansible]# ansible all -m user -a "name=alice password={{'123456' | password_hash('sha512')}}"

2)配置alice账户可以提权执行所有命令(control批量授权,node1主机验证)

使用lineinfile模块修改远程被管理端主机的/etc/sudoers文件,line=后面是需要添加到文件最后的具体内容(在/etc/sudoers文件末尾添加一行:alice ALL=(ALL) NOPASSWD:ALL)

格式:用户或组 主机列表=(提权身份) [NOPASSWD]:命令列表

[root@control ansible]# ansible all -m lineinfile -a "path=/etc/sudoers line='alice  ALL=(ALL) NOPASSWD:ALL'"
[root@control ~]# ssh alice@node1
[alice@node1 ansible]$ sudo systemctl restart sshd       //sudo已root身份运行命令,不需要输入密码
[alice@node1 ansible]$ exit

四、修改Ansible配置

沿用练习,修改ansible配置实现使用普通用户远程被控制端主机,具体要求如下:

  • 1)修改主配置文件
  • 2)设置ansible远程被管理端主机账户为alice
  • 3)设置ansible远程管理提权的方式为sudo
  • 4)修改主机清单文件
  • 5)修改主机清单配置文件,添加SSH参数

步骤1:配置普通用户远程管理其他主机

1)修改主配置文件(配置文件的相关内容可参考/etc/ansible/ansible.cfg)

[root@control ansible]# vim ~/ansible/ansible.cfg
[defaults]
inventory = ~/ansible/inventory
remote_user = alice          //以什么用户远程被管理主机(被管理端主机的用户名)[privilege_escalation]
become = true               //alice没有特权,是否需要切换用户提升权限
become_method = sudo       //如何切换用户(比如用su就可以切换用户,这里是sudo)
become_user = root          //切换成什么用户(把alice提权为root账户)
become_ask_pass = no        //执行sudo命令提权时是否需要输入密码

2)远程被管理端主机的alice用户,需要提前配置SSH密钥

[root@control ansible]# for i in node{1..5}
dossh-copy-id  alice@$i
done

验证:

[root@control ansible]# ssh alice@node1  //依次远程所有主机看看是否需要密码
[root@node1 ~]# exit      //退出远程连接
[root@control ansible]# ansible all -m command -a "who"     //测试效果

注意:远程登录node1应该输入node1上alice账户的密码,control没有alice用户


常见报错:

node1 | UNREACHABLE! => {"changed": false,"msg": "Failed to connect to the host via ssh: alice@node1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).","unreachable": true
}

问题分析:

  • “Failed to connect to host via ssh alice@node1”通过SSH使用alice远程连接到主机失败;
  • “Permission denied”因为SSH无法连接,所以报错权限拒绝

解决办法:手动ssh alice@主机名(如node1),看看是否可以实现免密码登录。

补充:Ansible的原理是基于ssh远程管理,如果无法实现alice免密码登录,则实验会失败!


3)修改inventory主机清单配置文件(参考即可,不需要操作)。

  • 假设个别主机的账户不同,该如何处理呢?
  • 假设有些主机需要使用密码远程呢?有些主机的SSH端口不是22呢?
[root@control ~]# cat  ~/ansible/inventory
[test]                    
node1          ansible_ssh_port=端口号        //自定义远程SSH端口
[proxy]
node2          ansible_ssh_user=用户名        //自定义远程连接的账户名
[webserver]
node[3:4]       ansible_ssh_pass=密码           //自定义远程连接的密码
[database]
node5
[cluster:children]                
webserver
Database

思维导图:

 

小结:

本篇章节为【第二阶段】AUTOMATION-DAY7 的学习笔记,这篇笔记可以初步了解到 Ansible项目、Ansible加密、sudo账户提权、Ansible配置文件。


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解


http://www.ppmy.cn/devtools/88082.html

相关文章

【区块链+绿色低碳】盈江县两山生态开发平台 | FISCO BCOS应用案例

当前林业碳汇场景中涉及林权认证、身份授权、多方机构协作、数据交换等流程,为解决复杂的业务协作所面临 的身份信息泄漏、数据造假、数据安全等问题,盈江县建设“盈江县两山生态开发平台”,在清查盈江县自然资源、 整合数据的基础上&#xf…

微信小程序实现聊天界面,发送功能

.wxml <scroll-view scroll-y"true" style"height: {{windowHeight}}px;"><view wx:for"{{chatList}}" wx:for-index"index" wx:for-item"item" style"padding-top:{{index0?30:0}}rpx"><!-- 左…

智能驾驶学习笔记,第一天

智能驾驶是智能汽车的核心&#xff0c;指基于先进的传感器和计算平台&#xff0c;通过人工智能技术,让汽车具备自主行驶的能力&#xff0c;旨在辅助驾驶员安全、便捷、高效地完成驾驶任务。智能驾驶有助于减少交通事故、改善交通拥堵&#xff0c;并提高行驶安全性和驾乘舒适性。…

【深度学习】基于pytorch的胶囊网络实现

参考资料&#xff1a; 阿里云实践&#xff1a;https://developer.aliyun.com/article/581717 动态路由机制讲解&#xff1a;https://www.bilibili.com/video/BV1oW411H7G1/?spm_id_from333.337.search-card.all.click&vd_source3b5e1109bdab0d21b23a5c46c4ed667d Hinton论…

es之must、filter、must_not、should

文章目录 概述mustfiltermust_notshouldmust和filter的区别 概述 在Elasticsearch中&#xff0c;布尔查询&#xff08;bool query&#xff09;是构建复杂查询的基本工具。它允许你组合多个查询子句&#xff0c;每个子句可以使用不同的逻辑操作符。常见的逻辑操作符包括 must、…

Python学习笔记49:游戏篇之外星人入侵(十)

前言 之前的文章&#xff0c;已经把基础的游戏功能完成了&#xff0c;就像我们之前项目先写好了基础代码一样&#xff0c;游戏基础的逻辑代码已经编写完毕&#xff0c;后面我们会一步步的填充这个游戏的功能。 我的文章内容和功能实现顺序和原文教学并不是一模一样&#xff0…

生成式人工智能(AIGC):开发者的得力助手还是职业威胁?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 在当今软件开发领域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;技术正在以前所未有的方式改变着开发者的工作…

Hadoop-YARN

简介 YARN是Hadoop的资源管理和作业调度系统&#xff0c;它将集群资源管理和作业调度/监控功能从Hadoop MapReduce的实现中分离出来&#xff0c;使得Hadoop可以支持除了MapReduce之外的其他数据处理模型。用户可以将各种服务框架部署在 YARN 上&#xff0c;由 YARN 进行统一地…