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

主要内容:

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

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值