项目练习 、 Ansible Vault 、 普通用户使用ansible

案例

链接

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

1.1 问题

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

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

1.2 方案

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

表-1 主机列表

image

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

1)创建role角色

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

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

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

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

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

[root@control ansible]# vim web.yml
---
- hosts: webserver
  roles:
    - http
[root@control ansible]# ansible-playbook web.yml

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

1)创建role角色

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

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

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

[root@control ansible]# cp  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/
#拷贝源码包软件
- name: install nginx through shell script.
  script: nginx_install.sh
  args:
    creates: /usr/local/nginx/sbin/nginx
#执行源码编译安装脚本,如果已经安装nginx,则不再执行安装脚本.
#args是关键词,设置script模块的参数,通过creates参数做判断,creates也是关键词
#creates后面跟文件名,如果creates判断文件存在的话就不再执行script模块对应的命令。

- name: copy nginx.conf to destination host.
  copy:
    src: nginx.conf
    dest: /usr/local/nginx/conf/nginx.conf

- name: run nginx service.
  shell: /usr/local/nginx/sbin/nginx
  args:
    creates: /usr/local/nginx/logs/nginx.pid
#nginx.pid存在,说明nginx已经启动。如果该文件存在,则不再启动nginx。
- name: set firewalld
  firewalld:
    service: http
    state: enabled
    permanent: yes
    immediate: yes

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

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

[root@control ansible]# ansible-playbook proxy.yml

加密敏感数据

2.1 问题

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

  • 使用ansible-vault管理敏感数据

2.2 步骤

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

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

1)加密敏感数据。

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

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

2)修改密码(rekey)

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

3)解密文件

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

4)使用密码文件

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

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

配置sudo权限

3.1 问题

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

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

3.2 方案

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

sudo基本流程如下:

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

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

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

授权格式如下:

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

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

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

3.3 步骤

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

步骤一:配置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

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

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

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

修改Ansible配置

4.1 问题

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

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

4.2 步骤

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

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

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命令提权时是否需要输入密码

思考:

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

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

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

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

验证效果:

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

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

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(失败),connect(连接),to(到),host(主机),via(通过)
permission(权限),denied(被拒绝)
Failed to connect to host via ssh alice@node1(通过ssh使用alice远程连接到主机失败)
Permission denied(因为无法连接,所以报错说权限被拒绝)
解决办法:手动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

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

image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容