sudo提权:修改/etc/sudoers配置文件
修改/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
实验一:利用ansible实现对用户alice的提权操作
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'"
[root@control ansible]# ssh alice@node1
如何验证?可以在node1电脑上面使用alice用户执行sudo重启服务的命令看看是否成功。
[alice@node1 ansible]$ sudo systemctl restart sshd #不需要输入密码
实验二:假设被控制主机上只可以使用alice这个用户进行操作
要求:
• 修改主配置文件
• 设置ansible远程被管理端主机账户为alice
• 设置ansible远程管理提权的方式为sudo
• 修改主机清单文件
• 修改主机清单配置文件,添加SSH参数
步骤一:配置普通用户远程管理其他主机
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命令提权时是否需要输入密码
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
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
PlayBook自动化操作:
要求:
• 熟悉Playbook语法格式
• 编写Playbook管理系统账户
• 编写Playbook管理逻辑卷
• 编写Playbook管理软件包
YAML语法格式:
• YAML是一个可读性高、用来表达数据序列的格式语言
• YAML:YAML Ain't a Markup Language
• YAML以数据为中心,重点描述数据的关系和结构
YAML的格式要求:
• "#"代表注释,一般第一行为三个横杠(---)
• 键值(key/value)对使用":"表示,数组使用"-"表示,"-"后面有空格
• ":"后面必须有空格
• 一般缩进由两个或以上空格组成,全文不可以使用tab键
• 相同层级的缩进必须对齐,缩进代表层级关系
• 区分大小写
• 扩展名为yml或者yaml
• 跨行数据需要使用>或者|,其中|会保留换行符
Playbook语法格式要求:
• 使用ansible-playbook命令运行playbook剧本
• playbook采用YAML格式编写
• playbook文件中由一个或多个play组成
• 每个play中可以包含:
• hosts(主机)、tasks(任务)、vars(变量)等元素组成
hosts由一个或多个组或主机组成,逗号分隔,
tasks由name(描述)和模块组成,name可写可不写;asks由一个或多个任务组成,多个任务按顺序执行
执行ansible-playbook命令可以使用-f选项自定义并发量。
定义多个主机和任务的剧本
1. [root@control ansible]# vim ~/ansible/test.yml
2. - hosts: test,webserver
3. tasks:
4. - name: This is my first playbook #name后面的内容可以任意
5. ping:
6. - name: Run a shell command
7. shell: touch ~/shell.txt
8. #hosts定义需要远程哪些被管理主机,hosts是关键词
9. #tasks定义需要执行哪些任务,tasks是关键词
10. #第一个任务调用ping模块,该模块没有参数
11. #第二个任务调用shell模块在被管理主机创建一个空文件~/shell
12. [root@control ansible]# ansible-playbook ~/ansible/test.yml -f 5
验证:到node1、node3、node4主机分别执行命令ls /root/shell.txt查看是否有该文件
```c
定义多个play的Playbook文件
1. [root@control ansible]# vim ~/ansible/test.yml
2. #第一个play剧目
3. ---
4. - hosts: test
5. tasks:
6. - name: This is first play
7. ping:
8. #第二个play剧目
9. - hosts: webserver
10. tasks:
11. - name: This is second play
12. ping:
Playbook应用案例1:
用户管理,创建系统账户、账户属性、设置密码(ansible-doc user)。
1. [root@control ansible]# vim ~/ansible/test_john.yml
2. ---
3. - hosts: webserver
4. tasks:
5. - name: Add the user 'johnd'
6. user:
7. name: johnd
8. uid: 1040
9. group: daemon
10. password: "{{ '123' | password_hash('sha512') }}"
11. #hosts定义需要远程的对象是webserver组,hosts是关键词
12. #tasks定义需要执行的任务,tasks是关键词
13. # name是第一个任务的描述信息,描述信息可以任意
14. # user是第一个任务需要调用的模块,user下面的缩进内容是给user模块的参数
15. # name是需要创建的用户名,uid是用户ID号
16. # group是用户属于哪个基本组
17. # password是用户的密码,密码是123,密码经过sha512算法加密
.
19. [root@control ansible]# vim ~/ansible/user_james.yml
20. ---
21. - hosts: webserver
22. tasks:
23. - name: Add 'james' with a bash shell
24. user:
25. name: james
26. shell: /bin/bash
27. groups: bin,adm
28. password: "{{ '123' | password_hash('sha512') }}"
29. #与上一个案例类似,groups指定用户属于哪些附加组.
31. [root@control ansible]# vim ~/ansible/user_johnd.yml
32. ---
33. - hosts: webserver
34. tasks:
35. - name: Remove the user 'johnd'
36. user:
37. name: johnd
38. state: absent
39. #删除系统账户johnd,state的值设置为absent是删除用户
2)使用playbook管理逻辑卷
准备工作:给node2主机再添加一块磁盘(以下实验磁盘名称仅为参考,不要照抄)。(ansible-doc parted,ansible-doc lvg,ansible-doc lvol)
1. [root@control ansible]# vim ~/ansible/lvm.yml
2. ---
3. - hosts: node2 #远程node2主机
4. tasks:
5. - name: Create a new primary partition with a size of 1GiB #任务的描述信息
6. parted: #调用parted模块进行分区
7. device: /dev/sdb #对/dev/sdb磁盘进行分区(磁盘名称不要照抄)
8. label: gpt #分区表类型为gpt,或msdos
9. number: 1 #分区编号(创建第几个分区)
10. state: present #present是创建分区,absent是删除分区
11. part_start: 1MiB #分区的开始位置(默认从最开始位置分区)
12. part_end: 1GiB #分区的结束位置(不写就分到磁盘最后位置)
13. - name: Create a volume group on top of /dev/sdb1 #第二个任务的描述信息
14. lvg: #调用lvg模块,创建VG卷组
15. vg: my_vg #要创建的卷组名称
16. pvs: /dev/sdb1 #使用哪个分区创建PV
17. - name: Create a logical volume of 512m #第三个任务的描述信息
18. lvol: #调用lvol模块创建LV
19. vg: my_vg #使用哪个VG创建LV
20. lv: my_lv #需要创建的LV名称
21. size: 512m #要创建的LV大小,可以不指定单位,默认单位m
使用playbook管理软件(ansible-doc yum)
RHEL或CentOS系统中的软件有组包的概念,使用yum grouplist或者dnf grouplist可以查看组包的名称。
1. [root@control ansible]# vim ~/ansible/package.yml
2. ---
3. - hosts: webserver #需要远程的主机是谁
4. tasks: #定义剧本需要执行的任务
5. - name: Install a list of packages #第一个任务的描述信息
6. yum: #调用yum模块安装软件
7. name: #安装软件的名字,它的值有多个,使用数组-
8. - httpd #安装httpd软件
9. - mariadb #安装mariadb软件
10. - mariadb-server #安装mariadb-server
11. - name: install the 'RPM Development Tools' package group #第二个任务的描述信息
12. yum: #调用yum模块安装软件组包
13. name: "@RPM Development Tools" #安装哪个组包,@是关键词
14. - name: update software #第三个任务的描述信息
15. yum: #调用yum模块升级软件
16. name: '*' #需要升级哪些软件
17. state: latest #latest代表升级软件
18. #备注:state的值可以是(present|absent|latest)
19. #present代表安装软件(默认是present);absent代表卸载软件
20. #latest代表升级软件
总结: