Ansible 和 SaltStack、Puppet 等都是配置管理系统(configuration management system)
Ansible 和 SaltStack 都是 Python 编译的自动化运维工具,都是使用模块管理。不一样的是Ansible没有客户端(使用的 SSH 通道传输)而 SaltStack 有客户端(虽然 SaltStack 也能够用 SSH通道,但和 Ansible 相比就是个笑话),这方面各有优势吧,有客户端的更稳定,没有客户端的更灵活可移植性强
相比 Puppet 来讲 Ansible 没有客户端(使用的 SSH 通道传输)、简单易用和日志集中控管python
Ansible 能够帮助咱们完成一些批量任务,或者完成一些须要常常重复的工做。
好比:同时在100台服务器上安装 NFS 服务,并在安装后启动服务。
好比:将某个文件一次性拷贝到100台服务器上。
好比:每当有新服务器加入工做环境时,你都要为新服务器部署某个服务,也就是说你须要常常重复的完成相同的工做。
这些场景中咱们均可以使用到 Ansible。web
Ansible 特色shell
Ansible 架构
Ansible 是用模块来管理的,而模块是 Python 写的,这就须要控制端和受控端都须要有 Python,这对于 LInux 不是问题
vim
YUM 安装 Ansiblecentos
Ansible 包在
epel
库,部分依赖在base
库缓存
[root@Ansible ~]# yum install ansible -y ## 查看Ansible版本信息(版本号低的,看看epel源有吗) [root@Ansible ~]# ansible --version ansible 2.7.10 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
上面指定了 Ansible 的配置文件位置,不过 Ansible 为了方便,也为了可移植性,配置文件不是固定的,下面根据前后顺序读取:bash
$ANSIBLE_CONFIG
信息ansible.cfg
文件ansible.cfg
文件/etc/ansible/ansible.cfg
文件经常使用配置服务器
[defaults] #通用默认配置 inventory /etc/ansible/hosts #被控制端IP或者DNS列表 library = /usr/share/my_modules/ ##默认搜寻模块的位置 remote_tmp = ~/.ansible/tmp #远程执行临时文件 local_tmp = ~/.ansible/tmp plugin_filters_cfg = /etc/ansible/plugin_filters.yml forks = 5 ##并行线程数 poll_interval = 15 ##回频率或轮询间隔时间 sudo_user = root ##sudo远程执行用户名 ask_sudo_pass = True ##使用sudo,是否须要输入密码 ask_pass = True ##是否须要输入密码 transport = smart ##通讯机制 remote_port = 22 ##远程SSH端口 module_lang = C ##模块和系统之间通讯的语言 module_set_locale = False gathering = implicit ##控制默认facts收集(远程系统变量) gather_subset = all gather_timeout = 10 roles_path = /etc/ansible/roles ##使用playbook搜索Ansible roles host_key_checking = False ##是否检查远程公钥指纹 sudo_exe = sudo ##sudo远程执行命令 sudo_flags = -H -S -n ##传递sudo以外的参数 timeout = 10 ##SSH超时时间 remote_user = root ##远程登陆用户名 log_path = /var/log/ansible.log ##日志文件存放路径 module_name = command ##Ansible命令默认执行的模块 executable = /bin/sh ##执行的shell环境,用户shell模块 hash_behaviour = replace ##特定的优先级覆盖变量 jinja2_extensions = jinja2.ext.do,jinja2.ext.i18 ##容许开启jinja2扩展模块 private_key_file = /path/to/file ##私钥文件存储位置 display_skipped_hosts = True ##显示跳过任何任务的状态 system_warnings = True ##禁用系统运行Ansible潜在问题警告 deprecation_warnings = True ##PlayBook输出禁用“不建议使用”警告 command_warnings = False ##command模块Ansible默认发出警告 nocolor = 1 ##输出带上颜色区别,0表示开启,1表示关闭 pipelining = False ##开启pipe SSH通道优化 [accelerate] ##accelerate缓存加速 accelerate_port = 5099 ##加速链接端口5099 accelerate_timeout = 30 ##命令执行超过期间,单位为s accelerate_connect_timeout = 5.0 ##上一个活动链接的时间,单位为min accelerate_daemon_timeout = 30 ##容许多个私钥被加载到daemon accelerate_multi_key = yes ##任何客户端想要链接daemon都要开启这个选项
## 添加客户主机信息,client清单下两台主机(IP,用户,密码,端口) [root@Ansible ~]# vim /etc/ansible/hosts [client] 192.168.1.2 ansible_ssh_user='root' ansible_ssh_pass='redhat' ansible_ssh_port='22' 192.168.1.3 ansible_ssh_user='root' ansible_ssh_pass='redhat' ansible_ssh_port='22'
验证 Ansible
能够把配置文件中 host_key_checking = False
注释去掉,防止第一次 SSH
连通须要公钥指纹致使的 Ansible
的连通失败架构
## 用ping模块测试主机是否连通 [root@Ansible ~]# ansible client -m ping 192.168.1.2 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.1.3 | SUCCESS => { "changed": false, "ping": "pong" } ## -m:调用什么模块。-a:执行什么动做 [root@Ansible ~]# ansible client -m command -a "df -h" 192.168.1.2 | CHANGED | rc=0 >> 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 17G 3.1G 14G 18% / devtmpfs 476M 0 476M 0% /dev tmpfs 488M 0 488M 0% /dev/shm tmpfs 488M 7.8M 480M 2% /run tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sda1 1014M 173M 842M 18% /boot tmpfs 98M 0 98M 0% /run/user/0 192.168.1.3 | CHANGED | rc=0 >> 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 17G 3.1G 14G 18% / devtmpfs 476M 0 476M 0% /dev tmpfs 488M 0 488M 0% /dev/shm tmpfs 488M 7.7M 480M 2% /run tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sda1 1014M 173M 842M 18% /boot tmpfs 98M 0 98M 0% /run/user/0
使用密钥对链接app
## 建立密钥对 [root@Ansible ~]# ssh-keygen -t rsa ## 发送到相应的主机上 [root@Ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.2 [root@Ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.3 ## 删除配置文件IP后面的帐号密码 [root@Ansible ~]# vim /etc/ansible/hosts [client] 192.168.1.2 192.168.1.3 ## 链接测试 [root@Ansible ~]# ansible client -m command -a "hostname" 192.168.1.3 | CHANGED | rc=0 >> Client2 192.168.1.2 | CHANGED | rc=0 >> Client1
组能够包括其余组
## 从新定义主机清单(组调用其余组在组名后面加上:children) [root@Ansible ~]# vim /etc/ansible/hosts [web] 192.168.1.2 [nfs] 192.168.1.3 [local] localhost ansible_connection=local [hosts:children] web nfs local ## 执行命令测试连通性 [root@Ansible ~]# ansible web --list-host hosts (1): 192.168.1.2 [root@Ansible ~]# ansible nfs --list-host hosts (1): 192.168.1.3 [root@Ansible ~]# ansible local --list-host hosts (1): localhost [root@Ansible ~]# ansible hosts --list-host hosts (3): 192.168.1.2 192.168.1.3 localhost ## Ansible自带一个all组,为所有主机 [root@Ansible ~]# ansible all --list-host hosts (3): 192.168.1.2 192.168.1.3 localhost
用别名代替IP
## 编辑文件 [root@Ansible ~]# vim /etc/ansible/hosts [web] web1 ansible_ssh_host=192.168.1.2 [nfs] nfs1 ansible_ssh_host=192.168.1.3 [local] localhost ansible_connection=local [hosts:children] web nfs local ## 列出全部主机 [root@Ansible ~]# ansible hosts --list-host hosts (3): web1 localhost nfs1
用 -i
指定文件
[root@Ansible ~]# vim hosts [client] 192.168.1.2 192.168.1.3 [root@Ansible ~]# ansible client -m command -a "w" -i ./hosts 192.168.1.2 | CHANGED | rc=0 >> 20:08:04 up 14:03, 2 users, load average: 0.00, 0.04, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.1.1 20:08 0.00s 0.14s 0.00s w root pts/1 192.168.1.254 14:04 6:28 0.38s 0.38s -bash 192.168.1.3 | CHANGED | rc=0 >> 20:08:04 up 14:02, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.1.1 20:08 0.00s 0.14s 0.00s w root pts/1 192.168.1.254 14:42 1:06m 0.43s 0.43s -bash