自动化运维工具:
shell脚本/Ansible(无客户端)/Saltstack(有客户端master-minio)
服务器部署流程
买云主机—环境部署—软件部署—配置部署—启动服务—测试—加入集群
ansible可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作
1.同时在100台服务器上安装nginx,并在安装后启动服务
2.将某个文件一次性拷贝到100台服务器上
3.每当有新服务器加入工作环境时,都要为服务器部署某个服务,要经常重复性的完成相同的工作
这些场景我们都可以使用ansible
1.ansible不需要单独安装客户端,ssh相当于ansible客户端
2.ansible不需要启动任何服务,仅需安装对应工具即可
3.ansible依赖大量的python模块实现批量管理
4.ansible配置文件/etc/ansible/ansible.cfg
1.连接插件(connector plugins)用于连接主机,用来连接被管理端
2.核心模块(core modules)连接主机实现操作,它依赖于具体的模块来做具体的事情
3.自定义模块(custom modules)根据自己的需求编写具体的模块
4.插件(plugins)完成模块功能的补充
5.剧本(playbooks)ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
6.主机清单(host inventory)定义ansible需要操作主机的范围
最重要的一点是ansible是模块化的,他所有的操作都依赖于模块
ansible工作架构:首先通过connection插件连接受控端所有主机,受控端有n个,可能针对于不同的服务器集群,因此我们就要对受控端进行合理的分配,将不同的集群做成不同的清单,保存在主机清单文件中,主机清单位于/etc/ansible/hosts文件中,在通过核心模块来传达指令,如果懂python也可以自定义模块,最后将各个模块组合在一起形成任务剧本,最终实现运维自动化
主机名 | IP | 角色 |
---|---|---|
ansible | 192.168.81.210 | ansible管理端 |
web | 192.168.81.220 | web服务器 |
nfs | 192.168.81.230 | nfs存储 |
backup | 192.168.81.240 | rsync备份服务器 |
[root@ansible ~]# yum -y install ansible
[root@ansible ~]# ansible --version
ansible 2.9.9
利用非交互式实现批量分发公钥与批量管理服务器
1生成公钥文件
[root@ansible ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
2.将公钥推送至远程服务器
[root@ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[root@ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[root@ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
3.能正常登录即可
[root@ansible ~]# ssh 192.168.81.220
Last login: Mon Jun 1 22:08:16 2020 from 192.168.81.1
[root@web ~]# exit
登出
Connection to 192.168.81.220 closed.
[root@ansible ~]# ssh 192.168.81.230
Last login: Mon Jun 1 22:10:56 2020 from 192.168.81.1
[root@nfs ~]# exit
登出
Connection to 192.168.81.230 closed.
[root@ansible ~]# ssh 192.168.81.240
Last login: Mon Jun 1 22:10:02 2020 from 192.168.81.1
[root@mysql ~]# exit
登出
Connection to 192.168.81.240 closed.
清单文件位于/etc/ansible/hosts
[root@ansible ~]# vim /etc/ansible/hosts
[web_clust] //定义清单名
192.168.81.220 //主机ip
192.168.81.230
192.168.81.240
[root@ansible ~]# ansible web_clust -m ping
192.168.81.240 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.81.230 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.81.220 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
如果提示permission denied(publickey.gssapi-keyex…)表示ssh生成的公钥有问题
ansible 主机组模块名 -m 模块名 -a 指定利用模块执行的动作参数 批量执行操作动作
command模块和shell模块的区别
command模块只是调用一个命令,不能添加类似|、&&、;、>这种的符号,也不能调用命令别名,shell模块相当于提供一个shell环境,可以使用管道、定向、并且等这种逻辑性的符号
3.1.获取主机清单中所有服务器的主机名
[root@ansible ~]# ansible web_clust -m command -a "hostname"
192.168.81.230 | CHANGED | rc=0 >>
nfs
192.168.81.240 | CHANGED | rc=0 >>
backup
192.168.81.220 | CHANGED | rc=0 >>
web
3.2.获取主机清单中所有服务器的ip地址
[root@ansible ~]# ansible web_clust -m shell -a "ifconfig ens33 | awk '{if(NR==2){print $1}}'"
192.168.81.240 | CHANGED | rc=0 >>
inet 192.168.81.240 netmask 255.255.255.0 broadcast 192.168.81.255
192.168.81.230 | CHANGED | rc=0 >>
inet 192.168.81.230 netmask 255.255.255.0 broadcast 192.168.81.255
192.168.81.220 | CHANGED | rc=0 >>
inet 192.168.81.220 netmask 255.255.255.0 broadcast 192.168.81.255
inventory文件通常用于定义要管理主机的认证信息,例如ssh登录用户名、登录密码以及key相关信息。
清单位置文件位于/etc/ansible/hosts
可以配置主机、主机组
主机:
主机组:
添加三台主机至web_clust(升级版)
[root@ansible ~]# vim /etc/ansible/hosts
[web_clust]
192.168.81.220
192.168.81.230
192.168.81.240
添加三台主机至web_clust(升级版)
[root@ansible ~]# vim /etc/ansible/hosts
[web_clust]
192.168.81.2[2:4]0
添加三台主机并指定密码(初版)
[root@ansible ~]# vim /etc/ansible/hosts
[web_clust]
192.168.81.220 ansible_ssh_pass='redhat'
192.168.81.230 ansible_ssh_pass='redhat'
192.168.81.240 ansible_ssh_pass='redhat'
添加三台主机并指定密码(升级版)
[root@ansible ~]# vim /etc/ansible/hosts
[web_clust]
192.168.81.2[2:4]0
[web_clust:vars]
ansible_ssh_pass='redhat'
添加三台主机并指定密码(拆分版)
[root@ansible ~]# vim /etc/ansible/hosts
[web_clust]
192.168.81.220
192.168.81.230
192.168.81.240
[web_clust:vars]
ansible_ssh_pass='redhat'
主机名 | IP | 角色 |
---|---|---|
ansible | 192.168.81.210 | ansible管理端 |
web | 192.168.81.220 | web服务器 |
nfs | 192.168.81.230 | nfs存储 |
backup | 192.168.81.240 | mysql数据库 |
[root@ansible ~]# yum -y install ansible
[root@ansible ~]# ansible --version
ansible 2.9.9
常用的配置是对应的主机做成对应的模块,然后将所有模块加入到主机组中
[root@ansible ~]# vim /etc/ansible/hosts
[web]
192.168.81.220
[nfs]
192.168.81.230
[mysql]
192.168.81.240
[web_clust:children]
web
nfs
backup
既可以对整个组进行操作
[root@ansible ~]# ansible web_clust -m ping
192.168.81.230 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.81.240 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.81.220 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
也可以对单个模块进行操作
[root@ansible ~]# ansible web -m ping
192.168.81.220 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@ansible ~]# ansible nfs -m ping
192.168.81.230 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@ansible ~]# ansible mysql -m ping
192.168.81.240 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
参数 | 用途 | 例子 |
---|---|---|
ansible_ssh_host | 定义hosts ssh地址 | ansible_ssh_host=192.168.81.220 |
ansible_ssh_port | 定义hosts 端口号也可以在ip后面加:定义 | ansible_ssh_prrot=666 |
ansibe_ssh_user | 定义hosts ssh认证用户 | ansible_ssh_user=user |
ansible_ssh_pass | 定义hosts ssh认证密码 | ansible_ssh_pass=redhat |
ansibe_sudo | 定义hosts sudo用户 | ansible_sudo=www |
ansibe_sudo_pass | 定义hosts sudo用户的认证密码 | ansible_sudo_pass=redhat |
ansibe_sudo_exe | 定义sudo命令的路径 | ansible_sudo_exe=/usr/bin/sudo |
ansible_coneection | 定义hosts连接方式 | ansible_connection=local |
ansible_ssh_private_key_file | 定义hosts私钥 | ansible_ssh_private_key_file=/root/key |
ansible_ssh_shell_tyep | 定义hosts shell类型 | ansible_ssh_shell_type=bash |
ansible_python_interpreter | 定义hosts任务执行python路径 | ansible_python_interpreter=/usr/bin/python2.6 |
ansbile_*—interpreter | 定义hosts解析其他语言路径 | ansible_*-interpreter=/usr/bin/ruby(前后都是下划线) |
|
| ansible_ssh_shell_tyep | 定义hosts shell类型 | ansible_ssh_shell_type=bash |
| ansible_python_interpreter | 定义hosts任务执行python路径 | ansible_python_interpreter=/usr/bin/python2.6 |
| ansbile_—interpreter | 定义hosts解析其他语言路径 | ansible_-interpreter=/usr/bin/ruby(前后都是下划线) |