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