Top

NSD AUTOMATION DAY07

  1. 案例1:综合练习(自动化部署Web集群)
  2. 案例2:加密敏感数据
  3. 案例3:配置sudo权限
  4. 案例4:修改Ansible配置

1 案例1:综合练习(自动化部署Web集群)

1.1 问题

晚自习课外综合练习题,创建一个名为cluster的role,完成一个综合项目,具体要求如下:

1.2 方案

综合练习题实验所需主机清单如表-1所示。

表-1 主机列表

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

1)创建role角色

  1. [root@control ansible]# ansible-galaxy init ~/ansible/roles/http

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

安装httpd,拷贝一个网页文件。

  1. [root@control ansible]# vim roles/http/tasks/main.yml
  2. ---
  3. - name: install httpd
  4. yum:
  5. name: httpd
  6. state: present
  7. - name: create index.html
  8. copy:
  9. content: "{{ansible_hostname}}"
  10. dest: /var/www/html/index.html
  11. - name: set firewalld
  12. firewalld:
  13. service: http
  14. state: enabled
  15. permanent: yes
  16. immediate: yes
  17. - name: start httpd
  18. service:
  19. name: httpd
  20. state: started
  21. enabled: yes
  22. #文件中包含多个任务,每个任务可以设置一个name名字(也可以没有name)
  23. #第一个任务调用yum模块安装httpd软件包
  24. #第二个任务调用copy模块创建一个新的网页文件(index.html)
  25. #调用copy模块时可以在没有源文件的情况下,直接使用content指定文件的内容
  26. #将该内容直接拷贝到被管理主机的某个文件中(/var/www/html/index.html)
  27. #第三个任务调用firewalld模块,设置防火墙规则,允许访问http服务
  28. #第四个任务调用service模块将httpd服务启动,并设置开机自启。

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

  1. [root@control ansible]# vim web.yml
  2. ---
  3. - hosts: webserver
  4. roles:
  5. - http
  6. [root@control ansible]# ansible-playbook web.yml

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

1)创建role角色

  1. [root@control ansible]# ansible-galaxy init ~/ansible/roles/proxy

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

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

  1. [root@control ansible]# cp lnmp_soft/nginx-1.17.6.tar.gz \
  2. ~/ansible/roles/proxy/files/
  3. [root@control ansible]# vim ~/ansible/roles/proxy/files/nginx_install.sh
  4. #!/bin/bash
  5. yum -y install gcc pcre-devel openssl-devel make tar
  6. cd /tmp
  7. tar -xf /tmp/nginx-1.17.6.tar.gz
  8. cd nginx-1.17.6
  9. configure --with-http_ssl_module
  10. make
  11. make install

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

  1. [root@control ansible]# vim ~/ansible/roles/proxy/files/nginx.conf
  2. worker_processes 2;
  3. #error_log logs/error.log;
  4. events {
  5. worker_connections 65535;
  6. }
  7.  
  8. http {
  9. include mime.types;
  10. default_type application/octet-stream;
  11. sendfile on;
  12. tcp_nopush on;
  13. keepalive_timeout 65;
  14. #gzip on;
  15. upstream webs {
  16. server 192.168.4.13;
  17. server 192.168.4.14;
  18. }
  19. server {
  20. listen 80;
  21. server_name localhost;
  22. location / {
  23. proxy_pass http://webs;
  24. root html;
  25. index index.html index.htm;
  26. }
  27. error_page 404 /404.html;
  28. error_page 500 502 503 504 /50x.html;
  29. location = /50x.html {
  30. root html;
  31. }
  32. }
  33. }

3)修改role配置文件。

  1. [root@control ansible]# vim roles/proxy/tasks/main.yml
  2. ---
  3. - name: copy nginx-1.17.6.tar.gz to proxy.
  4. copy:
  5. src: nginx-1.17.6.tar.gz
  6. dest: /tmp/
  7. #拷贝源码包软件
  8. - name: install nginx through shell script.
  9. script: nginx_install.sh
  10. args:
  11. creates: /usr/local/nginx/sbin/nginx
  12. #执行源码编译安装脚本,如果已经安装nginx,则不再执行安装脚本.
  13. #args是关键词,设置script模块的参数,通过creates参数做判断,creates也是关键词
  14. #creates后面跟文件名,如果creates判断文件存在的话就不再执行script模块对应的命令。
  15.  
  16. - name: copy nginx.conf to destination host.
  17. copy:
  18. src: nginx.conf
  19. dest: /usr/local/nginx/conf/nginx.conf
  20.  
  21. - name: run nginx service.
  22. shell: /usr/local/nginx/sbin/nginx
  23. args:
  24. creates: /usr/local/nginx/logs/nginx.pid
  25. #nginx.pid存在,说明nginx已经启动。如果该文件存在,则不再启动nginx。
  26. - name: set firewalld
  27. firewalld:
  28. service: http
  29. state: enabled
  30. permanent: yes
  31. immediate: yes

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

  1. [root@control ansible]# vim proxy.yml
  2. ---
  3. - hosts: proxy
  4. roles:
  5. - proxy
  6.  
  7. [root@control ansible]# ansible-playbook proxy.yml

2 案例2:加密敏感数据

2.1 问题

本案例要求,使用ansible-vault对敏感数据进行加密处理,具体要求如下:

2.2 步骤

实现此案例需要按照如下步骤进行。

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

1)加密敏感数据。

encrypt(加密)、decrypt(解密)、view(查看),rekey(重置密码)。

  1. [root@control ansible]# echo 123456 > data.txt #新建测试文件
  2. [root@control ansible]# ansible-vault encrypt data.txt #加密文件
  3. [root@control ansible]# cat data.txt
  4. [root@control ansible]# ansible-vault view data.txt #查看加密文件

2)修改密码(rekey)

  1. [root@control ansible]# ansible-vault rekey data.txt #修改密码
  2. Vault password: <旧密码>
  3. New Vault password: <新密码>
  4. Confirm New Vault password:<确认新密码>

3)解密文件

  1. [root@control ansible]# ansible-vault decrypt data.txt #解密文件
  2. [root@control ansible]# cat data.txt

4)使用密码文件

加密、解密每次都输入密码很麻烦,可以将密码写入文件。

  1. [root@control ansible]# echo "I'm secret data" > data.txt #需要加密的敏感数据
  2. [root@control ansible]# echo 123456 > pass.txt #加密的密码
  3. [root@control ansible]# ansible-vault encrypt --vault-id=pass.txt data.txt
  4. [root@control ansible]# cat data.txt
  5. [root@control ansible]# ansible-vault decrypt --vault-id=pass.txt data.txt
  6. [root@control ansible]# cat data.txt

3 案例3:配置sudo权限

3.1 问题

本案例要求使用sudo提升普通用户的权限,要求如下:

3.2 方案

sudo(superuser or another do)让普通用户可以以超级管理员或其他人的身份执行命令。

sudo基本流程如下:

  1. 管理员需要先授权(修改/etc/sudoers文件)
  2. 普通用户以sudo的形式执行命令

修改/etc/sudoers的方法如下:

  1. visudo(带语法检查,默认没有颜色提示)
  2. vim /etc/sudoers(不带语法检查,默认有颜色提示)

授权格式如下:

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

注意事项:命令需要写绝对路径,对组授权需要在组名称前面加%。

  1. [root@control ~]# cat /etc/sudoers #不要改,下面仅仅是语法格式的示例(例子)
  2. … …
  3. root ALL=(ALL) ALL
  4. tom ALL=(root) /usr/bin/systemctl
  5. %wheel      ALL=(ALL) ALL

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:配置sudo提权

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

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

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

使用lineinfile模块修改远程被管理端主机的/etc/sudoers文件,line=后面的内容是需要添加到文件最后的具体内容。

等于是在/etc/sudoers文件末尾添加一行:alice ALL=(ALL) NOPASSWD:ALL

  1. [root@control ansible]# ansible all -m lineinfile \
  2. -a "path=/etc/sudoers line='alice ALL=(ALL) NOPASSWD:ALL'"

如何验证?可以在node1电脑上面使用alice用户执行sudo重启服务的命令看看是否成功。

  1. [root@control ~]# ssh alice@node1
  2. [alice@node1 ansible]$ sudo systemctl restart sshd #不需要输入密码
  3. [alice@node1 ansible]$ exit

4 案例4:修改Ansible配置

4.1 问题

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

4.2 步骤

实现此案例需要按照如下步骤进行。

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

1)修改主配置文件,配置文件文件的内容可以参考/etc/ansible/ansible.cfg。

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

思考:

如果A主机ssh远程访问B主机,应该输入哪个主机的用户名和对应的密码?

如果张三要去李四家,应该使用谁家的钥匙,打开谁家的门?

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

  1. [root@control ansible]# for i in node1 node2 node3 node4 node5
  2. do
  3. ssh-copy-id alice@$i
  4. done

验证效果:

  1. [root@control ansible]# ssh alice@node1 #依次远程所有主机看看是否需要密码
  2. #注意:是远程登录node1,应该输入的是node1电脑上面alice账户的密码,control没有alice用户
  3. [root@node1 ~]# exit #退出远程连接
  4. [root@control ansible]# ansible all -m command -a "who" #测试效果
  5. [root@control ansible]# ansible all -m command -a "touch /test" #测试效果

常见报错(有问题可以参考,没问题可以忽略):

  1. node1 | UNREACHABLE! => {
  2. "changed": false,
  3. "msg": "Failed to connect to the host via ssh: alice@node1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
  4. "unreachable": true
  5. }
  6. 问题分析:
  7. 英语词汇:Failed(失败),connect(连接),to(到),host(主机),via(通过)
  8. permission(权限),denied(被拒绝)
  9. Failed to connect to host via ssh alice@node1(通过ssh使用alice远程连接到主机失败)
  10. Permission denied(因为无法连接,所以报错说权限被拒绝)
  11. 解决办法:手动ssh alice@主机名(如node1),看看是否可以实现免密码登录。
  12. Ansible的原理是基于ssh远程管理,如果无法实现alice免密码登录,则实验会失败!
  13.         如何实现免密码登录,可以参考案例上面的命令,或者第一阶段相关知识。

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

如果个别主机的账户不同,该如何处理呢?

如果有些主机需要使用密码远程呢?如果有些主机的SSH端口不是22呢?

  1. [root@control ~]# cat ~/ansible/inventory
  2. [test]                    
  3. node1     ansible_ssh_port=端口号             #自定义远程SSH端口
  4. [proxy]
  5. node2 ansible_ssh_user=用户名                    #自定义远程连接的账户名
  6. [webserver]
  7. node[3:4] ansible_ssh_pass=密码                 #自定义远程连接的密码
  8. [database]
  9. node5
  10. [cluster:children]                
  11. webserver
  12. database

附加思维导图,如图-1所示:

图-1