运维自动化平台是由管理机器[S]和业务机器[C]组成的, C/S。
管理机器:任务定制及发布;
业务机器:接收任务并执行任务。
puppet:
基于Ruby开发,有产品线已经在用,优点是历史悠久,比较成熟,在可远程可本地,功能强劲,批量执行需要写专门的配置文件,费力费时。而且有客户端在,和授权系统结合比较麻烦。
?
saltstack:
saltstack和ansible都是python流的,而且就功能上来讲,两者也极为相似,不同之处是salt stack是有客户端的,并且execution模块还用0MQ实现了pub-sub,命令和执行结果因此可以高效并行传输,不过成也萧何败也萧何,第一个sub阶段(将querystring下发到所有机器,然后收集机器响应的阶段)太依赖与客户端返回了,如果客户端未能及时返回或未响应的话,playbook执行阶段可能会直接漏掉这部分机器而没有任何提示,这对于运维来说是不可接受的。
?
ansible:
与前两者比起来,在特性上似乎并不抢眼,配置管理方面(playbook)绝对比不过老大哥puppet,批量执行方面也只是多线程,不像saltstack那么高大上,不过ansible搜索热度高出saltstack三倍多,显然靠的不是吹牛,至少,ansible至少不会悄悄的丢机器,这给了我们一个定心丸,而且仅依赖ssh,与登录授权管理系统天然集成,简单即有效,没有比这更美妙的事情了。
ansible 是一种由 Python 开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible 是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是 ansible 所运行的模块,ansible 只是提供一种框架。主要包括:
?
特性
?
优点
?
基本架构
ansible 采用 paramiko 协议库(Fabric 也使用这个,基于 python 开发,支持 SSHV2),通过 ssh 或者 ZeroMQ 等连接主机。ansible 在控制主机主机将 ansible 模块通过 ssh 协议(或者 Kerberos、LDAP)推送到被管节点执行,执行完之后自动删除。控制主机与被管理节点之间支持 local、SSH、ZeroMQ 三种连接方式,默认使用基于 SSH 的连接。在规模较大的情况下使用 ZeroMQ 连接方式会明显改善执行速度。
?
工作原理:
反馈字体颜色
绿色 未发生变化
黄色 更改生效
红色 执行错误
?
约定事项:
主机名称 |
IP 地址 |
manage01 |
10.10.10.201 |
node1 |
10.10.10.202 |
node2 |
10.10.10.203 |
node3 |
10.10.10.204 |
所有服务器操作
[root@manage01 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.10.10.201 manage01 10.10.10.202 node01 10.10.10.203 node02 10.10.10.204 node03
[root@manage01 ~]# systemctl disable firewalld [root@manage01 ~]# sed -i -r ‘/SELINUX=/c\SELINUX=disabled‘ /etc/selinux/config [root@manage01 ~]# setenforce 0
1、修改配置文件,配置时间服务器为阿里云的时间服务器 [root@manage01 ~]# egrep "^server" /etc/chrony.conf server ntp1.aliyun.com server ntp2.aliyun.com server ntp3.aliyun.com server ntp4.aliyun.com #注释 # pool 2.centos.pool.ntp.org iburst 2、重启服务chronyd [root@manage01 ~]# systemctl restart chronyd.service 3、查看源信息 #chronyc chrony的命令行客户端 [root@manage01 ~]# chronyc sources -v 210 Number of sources = 2 =============================================================================== ^? 120.25.115.20 2 6 1 3 +663us[ +663us] +/- 23ms ^? 203.107.6.88 2 6 1 2 -1326us[-1326us] +/- 17ms
[root@manage01 ~]# yum -y install epel-*
管理端和被管理端连接时基于 ssh 的,所以有两种连接方式
1) 基于 ssh 口令
2)基于 ssh 证书
如果想不需要运维人员干预,被管理端必须允许管理端证书免密登陆。
#管理端manage01生成ssh公私钥 [root@manage01 ~]# ssh-keygen #将公钥传给node1 [root@manage01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.10.10.202 #将公钥传给node2 [root@manage01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.10.10.203 #将公钥传给node3 [root@manage01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.10.10.204 小窍门 免交互创建公私钥 [root@manage01 ansible]# ssh-keygen -f /root/.ssh/id_rsa -N "" -f 指定密钥存放路径 -N "" 新密码设置为空 -P "" 老密码是什么 #非交互式传公钥 [root@manage01 ansible]# yum -y install sshpass [root@manage01 ansible]# sshpass -p666666 ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub root@10.10.10.202 #StrictHostKeyChecking 严厉的主机监测=no 就不会问你yes|no了 #sshpass -p 登陆密码 :非交互式传密码 #ssh-copy-id -i:指定公钥文件路径 #-o StrictHostKeyChecking=no:不记录对方主机信息,严厉的主机监测=no 就不会问你yes|no了 #测试证书是否生效 [root@manage01 ~]# for i in `seq 202 204`;do ssh root@10.10.10.$i "hostname" ; done node01 node02 node03
安装方式:
1)yum
[root@manage01 ~]# yum -y install ansible [root@manage01 ~]# ansible --version ansible 2.9.23
2) 源码
1、官网下载地址:https://releases.ansible.com/ansible
[root@manage01 ~]# wget https://releases.ansible.com/ansible/ansible-2.9.3.tar.gz
2、安装ansible
[root@manage01 ~]# tar xf ansible-2.9.3.tar.gz [root@manage01 ~]# mv ansible-2.9.3 /opt/ansible [root@manage01 ~]# cd /opt/ansible-2.9.3 #python软件包安装--1、安装依赖 [root@manage01 ansible-2.9.0rc3]# pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ [root@manage01 ansible]# ln -s /usr/bin/pip3 /usr/bin/pip #python软件包安装--2、安装软件 [root@manage01 ansible-2.9.0rc3]# pip install --user ansible -i https://pypi.tuna.tsinghua.edu.cn/simple/ #安装后设置 [root@manage01 ~]# ln -s /usr/bin/python3 /usr/bin/python [root@manage01 ~]# ln -s /opt/ansible/bin/* /usr/bin/ [root@manage01 ~]# cp /opt/ansible/examples/ansible.cfg /etc/ansible/ [root@manage01 ~]# cp /opt/ansible/examples/hosts /etc/ansible/
FAQ1
[root@manage01 ansible-2.9.0rc3]# ./bin/ansible -m ping 10.10.10.201 [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match ‘all‘ [WARNING]: Could not match supplied host pattern, ignoring: 10.10.10.201 #触发原因 #执行ansible的时候回去读取客户端文件hosts,如果没有把客户端加入到hosts文件,就说明无法ansible无法管理。 #解决方案 [root@manage01 ansible]# mkdir /etc/ansible [root@manage01 ansible]# cp examples/hosts /etc/ansible/ #将需要管理的客户端IP地址写入hosts文件,可以分组或者直接写 [root@manage01 ~]# cat /etc/ansible/hosts 10.10.10.[202:204] #分组方式 [group1] 10.10.10.[202:204]
管理端 ansible 目录:/etc/ansible
[root@manage01 ansible]# tree . ├── ansible.cfg #ansible配置文件,不需要配置 ├── hosts #主机列表 └── roles #角色列表 1 directory, 2 files
[root@manage01 ansible]# egrep -v "(^#|^$)" /etc/ansible/hosts [group1] #名字可以随便起 后面跟上业务机器的IP地址或者域名 node01 node02 node03
关于业务机器分组
分组中使用范围 [nginx] 组名 apache[1:10].aaa.com 表示apache1.aaa.com到apache10.aaa.com这10台机器 nginx[a:z].aaa.com 表示nginxa.aaa.com到nginxz.aaa.com共26台机器 10.1.1.[11:15] 表示10.1.1.11到10.1.1.15这5台机器 如果业务机器的SSH端口不是22 10.1.1.13:2222 表示10.1.1.13这台,但ssh端口为2222 指定业务机器别名,未做免密登陆的机器可以通过下面的机器设置账号密码 nginx1 ansible_ssh_host=10.1.1.13 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass="123456" ansible_ssh_host 指定业务机器的IP或域名 ansible_ssh_port 指定业务机器的ssh端口 ansible_ssh_user 指定业务机器的ssh用户名 ansible_ssh_pass 指定业务机器的ssh用户名密码 利用机器别名分组 nginx1 ansible_ssh_host=10.1.1.13 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass="123456" nginx2 ansible_ssh_host=10.1.1.12 [nginx] nginx1 #写服务器别名 nginx2 [root@manage01 ansible]# egrep -v "(^#|^$)" /etc/ansible/hosts #别名定义 web1 ansible_ssh_host=192.168.98.203 ansible_ssh_port=12121 #分组 [group1] 192.168.98.201 #未做免密登陆机器 192.168.98.202:12121 ansible_ssh_user=sko ansible_ssh_pass=‘123‘ #别名机器 web1 ansible_ssh_user=sko ansible_ssh_pass=‘123‘
我们可以使用ansible通过调用ping模块来测试分组机器或某个机器 -m 指定使用的模块 group1 业务机器分组 #测试单个机器 #测试主机列表中的机器 #测试单个机器方法 [root@manage01 ~]# ansible -m ping node01 Are you sure you want to continue connecting (yes/no)? yes #首次连接host服务器需验证问题 node01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } #测试主机列表中的机器方法 [root@manage01 ~]# ansible -m ping group1 node03 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } node02 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } node01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
FAQ2
首次连接host服务器需验证问题
原因:
当ansible首次去进行ssh连接一个服务器的时候,由于在本机的~/.ssh/known_hosts文件中没有 fingerprint key串,ssh第一次连接的时候一般会提示输入yes 进行确认为将key字符串加入到 ~/.ssh/known_hosts 文件中。
#实现跳过 ssh 首次连接提示验证部分 vim /etc/ansible/ansible.cfg 70 # uncomment this to disable SSH key host checking 71 host_key_checking = False #取消注释
?
学习参考地址:https://www.zutuanxue.com/
原文:https://blog.51cto.com/rick/3265474