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

avatar
作者
筋斗云
阅读量:0

主要内容:

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: httpd     state: present - name: create index.html  //任务2:调用copy模块创建新的网页文件index.html   copy:     content: "{{ansible_hostname}}"    //变量已被YAML识别     dest: /var/www/html/index.html - name: start httpd    //任务3:调用service模块将httpd服务启动并设置开机自启   service:     name: httpd.service     state: started     enabled: yes - name: set firewalld   //任务4:调用firewalld模块,设置防火墙规则,允许访问http服务   firewalld:     service: http      //或者port: 80/tcp     state: enabled     //开启防火墙规则     permanent: yes     immediate: 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: webserver   roles:      - 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.gz     dest: /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 firewalld   firewalld:     service: http      //设置防火墙规则,允许服务通过     state: enabled     permanent: yes     immediate: yes

解释说明:

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

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

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

[root@control ansible]# vim proxy.yml --- - hosts: proxy   roles:     - 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} do   ssh-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:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!