Ansible-入门使用方法
Ansible介绍
自动化运维工具,统一配置管理工具。自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。
统一配置管理工具:
- Ansible python 基于ssh通信,不用安装客户端
- SaltStack python 不基于ssh,使用自己的客户端和服务端通信,跨平台,跨系统操作。
- puppet Raby
Ansible的功能及优点
1.远程执行
批量执行远程命令,可以对多台主机进行远程操作
2.配置管理
批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停
3.事件驱动
通过Ansible的模块,对服务进行不同的事件驱动
比如:
1)修改配置后重启
2)只修改配置文件,不重启
3)修改配置文件后,重新加载
4)远程启停服务管理
4.管理公有云
通过API接口的方式管理公有云,不过这方面做的不如saltstack
.
saltstack本身可以通过saltcloud管理各大云厂商的云平台。
5.二次开发
因为语法是Python,所以便于运维进行二次开发。
6.任务编排
可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署
7.跨平台,跨系统
几乎不受到平台和系统的限制,比如安装apache
和启动服务
在Ubuntu上安装apache服务名字叫apache2
在CentOS上安装apache服务名字叫httpd
在CentOS6上启动服务器使用命令:/etc/init.d/nginx start
在CentOS7上启动服务器使用命令:systemctl start nginx
Saltstack基础使用
# 1.安装服务端和客户端
[root@m01 ~]# yum install -y salt-master salt-minion
# 2.客户端
[root@m01 ~]# yum install -y salt-minion
# 3.修改客户端的配置文件
[root@m01 ~]# vim /etc/salt/minion
master: 10.0.0.61
# 4.一定先启动服务端,再启动客户端
[root@m01 ~]# systemctl start salt-master salt-minion
[root@m01 ~]# systemctl start salt-minion
[root@oldgirl ~]# /etc/init.d/salt-minion start
# 查看认证key
[root@m01 ~]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
m01
oldgirl
web01
Rejected Keys:
### 认证1个key
[root@m01 ~]# salt-key -a web01
### 全部认证
[root@m01 ~]# salt-key -A
[root@m01 ~]# salt '*' test.ping
[root@m01 ~]# salt '*' cmd.run 'touch /root/zls123_456.txt'
环境
主机名 | wanIP | lanIP | 角色 |
---|---|---|---|
m01 | 10.0.0.61 | 172.16.1.61 | Ansible控制端 |
web01 | 10.0.0.7 | 172.16.1.7 | Ansible被控端 |
web02 | 10.0.0.8 | 172.16.1.8 | Ansible被控端 |
web03 | 10.0.0.9 | 172.16.1.9 | Ansible被控端 |
lb01 | 10.0.0.5 | 172.16.1.5 | Ansible被控端 |
lb02 | 10.0.0.6 | 172.16.1.6 | Ansible被控端 |
db01 | 10.0.0.51 | 172.16.1.51 | Ansible被控端 |
backup | 10.0.0.41 | 172.16.1.41 | Ansible被控端 |
nfs | 10.0.0.31 | 172.16.1.31 | Ansible被控端 |
安装
[root@m01 ~]# yum -y install ansible
ansible配置文件
/etc/ansible/ansible.cfg
/etc/ansible/hosts 主机清单配置文件
[root@m01 ~]# cat /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
host_key_checking = False #跳过检查主机指纹,在密码验证的时候忽略yes/和no的那一步。
log_path = /var/log/ansible.log #ansible日志
主机清单
让ansible知道哪些机器需要维护,还有hosts的作用。
连接方式:
ip + port+user+pass
#方式一、IP+端口+用户+密码
[root@m01 ~]# vi /etc/ansible/hosts
[webs]
10.0.0.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
10.0.0.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
hostname+pass
# 写法一
[root@m01 ~]# vi /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7 ansible_ssh_pass='1'
web02 ansible_ssh_host=10.0.0.8 ansible_ssh_pass='1'
[root@m01 ~]# ansible web_group -m ping
web02 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
web01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
# 写法二(需要编辑hosts)
[root@m01 ~]# vi /etc/ansible/hosts
[web_group]
web01 ansible_ssh_pass='1'
web02 ansible_ssh_pass='1'
[root@m01 ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.8 web02
10.0.0.7 web01
10.0.0.9 web03
10.0.0.31 nfs01
[root@m01 ~]# ansible web_group -m ping
web02 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
web01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
nfs01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
# 写法三
[web_group]
web0[1:3] ansible_ssh_pass='1'
# 表示的是web01到web03;需要编辑hosts
# 写法四,定义变量
[web_group]
web0[1:3]
[web_group:vars]
ansible_ssh_pass='1'
# 需要编辑hosts,做主机解析
[root@m01 ~]# ansible web_group -m ping
web01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
web02 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
web03 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
主机密钥
# 先分发密钥
[root@m01 ~]# ssh-keygen
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.51
[root@m01 ~]# vi /etc/ansible/hosts
[web_group]
10.0.0.7:22
10.0.0.8
10.0.0.9
[root@m01 ~]# ansible web_group -m ping
10.0.0.8 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.0.0.9 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.0.0.31 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.0.0.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.0.0.51 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
推荐使用的方式
不同用处的主机分成不同的组。
# 需要分发主机密钥
[root@m01 ~]# vi /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7 ansible_ssh_port=22 # 后面ssh端口不是22的,可以使用该参数,更改端口
web02 ansible_ssh_host=10.0.0.8
[backup_group]
backup ansible_ssh_host=10.0.0.41
[nfs_group]
nfs ansible_ssh_host=10.0.0.31
[db_group]
db01 ansible_ssh_host=10.0.0.51
db02 ansible_ssh_host=10.0.0.52
# =======================================
# 分组书写的方式之一
[root@m01 ~]# vi /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7 ansible_ssh_port=22
web02 ansible_ssh_host=10.0.0.8
[backup_group]
backup ansible_ssh_host=10.0.0.41
[nfs_group]
nfs ansible_ssh_host=10.0.0.31
[db_group]
db01 ansible_ssh_host=10.0.0.51
db02 ansible_ssh_host=10.0.0.52
# 可以引用上面的分组,!(和分组里面的主机名),比如安装rsync在特定的机器上,用此操作。
[rsync:children]
nfs_group
backup_group
[root@m01 ~]# ansible rsync -m ping
nfs | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
backup | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@m01 ~]# ansible rsync -m shell -a 'hostname'
nfs | CHANGED | rc=0 >>
nfs01
backup | CHANGED | rc=0 >>
backup
[root@m01 ~]# ansible rsync -m shell -a 'yum -y install rsync'
# 会提示ansible有专门的yum模块
[WARNING]: Consider using the yum module rather than running 'yum'. If you need to use command because yum is insufficient you can
add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
# 后面会有返回安装过后的值
查看主机
# 查看分组中有哪些主机
[root@m01 ~]# ansible rsync --list-host
# 查看所有的主机
[root@m01 ~]# ansible all --list-host
主机的指定:
1.组名字
2.[]标签名
3.IP(密钥连接的时候)
4.主机名
# 语法
ansible 指定主机(IP、主机清单名字、all) -m 指定模块
ansible webs -m ping
-m # 指定模块