一、ansible角色(ansible-galaxy)
二、ansible加密解密(ansible-vault)
三、ansible实现sudo提权
四、特殊的主机清单变量
一、Ansible角色
Roles产生原因
在实际生产环境中,为了实现不同功能,我们会编写大量的Playbook文件
每个Playbook文件可能还会调用其他文件,如变量文件
对于海量的、无规律的文件,管理起来是一件非常困难的事情
1.什么是Roles:层次性、结构化的目录结构
(1)角色初始化:
anisble-galaxy init roles/motd
(2)列出已有角色:
ansible-galaxy list
(3)目录结构
--roles目录
--各种角色
--角色的目录
files/ tasks/ vars/ meta/ default/ templates/ handlers/
main.yml main.yml main.yml main.yml main.yml
1)files目录
存放上传的文件(例如copy模块或script模块调用的文件)
2)templates目录
存放Jinja2模板文件(当使用template模块时)
3)tasks目录
角色的任务列表。main.yml文件可以使用include指令包含其他位于此目录中的task文件。
4)handlers目录
触发条件时执行的动作
5)vars目录(优先级高)
定义角色变量
6)defaults目录
定义角色默认变量。当没有在vars目录中定义变量时,会使用defaults目录中的默认变量
7)meta目录
作者邮箱等信息
8)README
二、Ansible加密解密(ansible-vault)
(1)对文件加密:加密后文件内容变成秘文
(2)--vault-password-file:指定密码文件,对文件加密,解密,将密码写在密码文件里面
(3)--ask-vault-password:执行加密的剧本提示输入密码
(1)对文件加密
ansible-vault decrypt hello.txt
## 常用选项
encrypt:加密
decrypt:解密
view:查看
rekey:重置密码
(2)--vault-password-file:指定密码文件,对文件加密解密
echo "tedu.cn" > pass.txt
echo "Hello Linux" > data.txt
ansible-vault encrypt --vault-password-file=pass.txt data.txt
(3)--ask-vault-password:执行加密的剧本
ansible-vault encrypt user_test.yml
ansible-playbook --ask-vault-password user_test.yml
Vault password: 123456
三、ansible实现sudo提权
1.普通sudo提权配置方式(修改/etc/sudoers文件)
(1)格式:
用户名或组名(%groupname) 在集中认证域中有效,单机忽略 可以执行的命令列表
用户/%组 ALL=(ALL) NOPASSWD:ALL(所有权限都没密码)
(2)例子:给用户提权
zs,lisi ALL=(ALL) /usr/sbin/useradd, /usr/sbin/usermod -G somegroup
2.ansible实现sudo提权
(1)# 被控节点创建用户并配置sudo提权
[root@pubserver ansible]# vim sudouser.yml
---
- name: sudo user
hosts: all
tasks:
- name: create sudo user
user:
name: alice
password: "{{'123456'|password_hash('sha512')}}"
state: present
- name: config sudo
lineinfile:
path: /etc/sudoers
line: "alice ALL=(ALL) NOPASSWD: ALL"
state: present
(2)# 修改ansible配置文件
[root@pubserver ansible]# vim ansible.cfg
[defaults]
inventory = inventory
host_key_checking = false
module_name = shell
nocows = true
roles_path = ./roles
remote_user = alice
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
(3)# 配置ssh使用alice用户免密登录,alice密码123456
[root@pubserver ansible]# for i in web1 web2 db1
do
ssh-copy-id alice@$i
done
(4)# 测试:ansible all -m ping
四、特殊的主机清单变量
如某个被控节点不能"免密登录"(登录必须要密码)、ssh服务端口不是标准22端口等情况
则需要配置特殊的主机清单变量
## 常用配置
ansible_ssh_host:指定被控节点服务器IP地址
ansible_ssh_user:指定登陆远程主机的用户名
ansible_ssh_pass:指定登陆远程主机的密码
ansible_ssh_port:指定登陆远程主机的端口号
1.操作演示
(1)# 调整web1主机配置用于测试
[root@web1 ~]# rm -rf /root/.ssh/authorized_keys #清理公钥恢复密码登录
[root@web1 ~]# systemctl disable --now firewalld #关闭防火墙
[root@web1 ~]# vim +17 /etc/ssh/sshd_config #配置ssh端口为2222
Port 2222
[root@web1 ~]# systemctl restart sshd #重启sshd服务
# 调整pubserver的hosts文件注释web1主机名解析
[root@pubserver ansible]# vim /etc/hosts
...
#192.168.88.11 web1
ssh web1 -p 2222
(2)# 配置特殊的主机清单变量
[root@pubserver myansible]# vim inventory
[group1]
web1 ansible_ssh_host=192.168.88.11 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass=a
web2
db1
# 测试特殊的主机清单变量,可以成功
[root@pubserver myansible]# ansible all -m ping
一、ansible角色(ansible-galaxy)
二、ansible加密解密(ansible-vault)
三、ansible实现sudo提权
四、特殊的主机清单变量
一、Ansible角色
Roles产生原因
在实际生产环境中,为了实现不同功能,我们会编写大量的Playbook文件
每个Playbook文件可能还会调用其他文件,如变量文件
对于海量的、无规律的文件,管理起来是一件非常困难的事情
1.什么是Roles:层次性、结构化的目录结构
(1)角色初始化:
anisble-galaxy init roles/motd
(2)列出已有角色:
ansible-galaxy list
(3)目录结构
--roles目录
--各种角色
--角色的目录
files/ tasks/ vars/ meta/ default/ templates/ handlers/
main.yml main.yml main.yml main.yml main.yml
1)files目录
存放上传的文件(例如copy模块或script模块调用的文件)
2)templates目录
存放Jinja2模板文件(当使用template模块时)
3)tasks目录
角色的任务列表。main.yml文件可以使用include指令包含其他位于此目录中的task文件。
4)handlers目录
触发条件时执行的动作
5)vars目录(优先级高)
定义角色变量
6)defaults目录
定义角色默认变量。当没有在vars目录中定义变量时,会使用defaults目录中的默认变量
7)meta目录
作者邮箱等信息
8)README
二、Ansible加密解密(ansible-vault)
(1)对文件加密:加密后文件内容变成秘文
(2)--vault-password-file:指定密码文件,对文件加密,解密,将密码写在密码文件里面
(3)--ask-vault-password:执行加密的剧本提示输入密码
(1)对文件加密
ansible-vault decrypt hello.txt
## 常用选项
encrypt:加密
decrypt:解密
view:查看
rekey:重置密码
(2)--vault-password-file:指定密码文件,对文件加密解密
echo "tedu.cn" > pass.txt
echo "Hello Linux" > data.txt
ansible-vault encrypt --vault-password-file=pass.txt data.txt
(3)--ask-vault-password:执行加密的剧本
ansible-vault encrypt user_test.yml
ansible-playbook --ask-vault-password user_test.yml
Vault password: 123456
三、ansible实现sudo提权
1.普通sudo提权配置方式(修改/etc/sudoers文件)
(1)格式:
用户名或组名(%groupname) 在集中认证域中有效,单机忽略 可以执行的命令列表
用户/%组 ALL=(ALL) NOPASSWD:ALL(所有权限都没密码)
(2)例子:给用户提权
zs,lisi ALL=(ALL) /usr/sbin/useradd, /usr/sbin/usermod -G somegroup
2.ansible实现sudo提权
(1)# 被控节点创建用户并配置sudo提权
[root@pubserver ansible]# vim sudouser.yml
---
- name: sudo user
hosts: all
tasks:
- name: create sudo user
user:
name: alice
password: "{{'123456'|password_hash('sha512')}}"
state: present
- name: config sudo
lineinfile:
path: /etc/sudoers
line: "alice ALL=(ALL) NOPASSWD: ALL"
state: present
(2)# 修改ansible配置文件
[root@pubserver ansible]# vim ansible.cfg
[defaults]
inventory = inventory
host_key_checking = false
module_name = shell
nocows = true
roles_path = ./roles
remote_user = alice
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
(3)# 配置ssh使用alice用户免密登录,alice密码123456
[root@pubserver ansible]# for i in web1 web2 db1
do
ssh-copy-id alice@$i
done
(4)# 测试:ansible all -m ping
四、特殊的主机清单变量
如某个被控节点不能"免密登录"(登录必须要密码)、ssh服务端口不是标准22端口等情况
则需要配置特殊的主机清单变量
## 常用配置
ansible_ssh_host:指定被控节点服务器IP地址
ansible_ssh_user:指定登陆远程主机的用户名
ansible_ssh_pass:指定登陆远程主机的密码
ansible_ssh_port:指定登陆远程主机的端口号
1.操作演示
(1)# 调整web1主机配置用于测试
[root@web1 ~]# rm -rf /root/.ssh/authorized_keys #清理公钥恢复密码登录
[root@web1 ~]# systemctl disable --now firewalld #关闭防火墙
[root@web1 ~]# vim +17 /etc/ssh/sshd_config #配置ssh端口为2222
Port 2222
[root@web1 ~]# systemctl restart sshd #重启sshd服务
# 调整pubserver的hosts文件注释web1主机名解析
[root@pubserver ansible]# vim /etc/hosts
...
#192.168.88.11 web1
ssh web1 -p 2222
(2)# 配置特殊的主机清单变量
[root@pubserver myansible]# vim inventory
[group1]
web1 ansible_ssh_host=192.168.88.11 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass=a
web2
db1
# 测试特殊的主机清单变量,可以成功
[root@pubserver myansible]# ansible all -m ping