Ansible自动化运维
人工运维时代
运维人员大多需要维护数量众多的机器,反复重复的劳动,很多机器需要同时部署相同的服务或是执行命令,还得反复登录不同的机器执行。
例如再backup服务器上部署Rsync服务,需要再所有其他的服务器上部署Rsync客户端配置一遍。
一台台机器登录执行命令实在太繁琐,运维人员也常用Xshell,SecureCRT之类的工具添加多个服务器的标签,提高快速连接服务器的效率。
自动化运维时代。
SSH自动化运维时代是指2003-2012年,当时SSH自动化运维是很流行的,通过再管理机器统一创建密钥对,将私钥留在管理机上,公钥发到所有被管理的机器,然后开发脚本实现批量管理。
系统管理员日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等等。
如果主机数量庞大,单靠人工维护实在让人难以忍受。
早期运维人员会根据自己的生产环境来写特定脚本完成大量重复性工作,这些脚本复杂且难以维护。
系统管理员面临的问题主要是1.系统配置管理。2.远程执行命令。因此诞生了很多开源软件,系统维护方面有fabric,puppet,chef,ansible,saltstack等,这些软件擅长维护系统状态或方便的对大量主机进行批量的命令执行。
其中有两款软件都是用Python语言开发的,也就是saltstack,ansible,学习简单,功能强大。
自动化运维趋势
如今的自动化运维,不再是一个批量自动化管理软件就可以解决所有问题了,运维管理高速发展,从人肉运维到自动化运维,再到数据化运维,可视化运维,到AI智能运维,运维界倡导DevOps,AIOps运维,前景十分广阔,给用户更广阔的施展空间。
Ansible介绍
Ansible是一个同时管理多个远程主机的软件(任何可以通过SSH协议登录的机器),因此Ansible可以管理远程虚拟机,物理机,也可以是本地主机。
Ansible通过SSH协议实现管理节点,远程节点的通信。只要是能够SSH登录的主机完成的操作,都可以通过Ansible自动化操作,比如批量复制,批量删除,批量修改,批量查看,批量安装,重启,更新等。
Ansible管理机安装部署
1.在管理节点,管理机上安装ansible软件 [root@m01 ~]# yum install epel-release ansible libselinux-python -y 2.检查ansible软件 [root@m01 ~]# rpm -ql ansible |grep -E '^/etc|^/usr/bin' /etc/ansible #Ansible软件主目录 /etc/ansible/ansible.cfg #Ansible主配置文件 /etc/ansible/hosts #Ansible软件被管理节点的主机列表文件 /etc/ansible/roles /usr/bin/ansible #Anisble批量管理命令 /usr/bin/ansible-2 /usr/bin/ansible-2.7 /usr/bin/ansible-config /usr/bin/ansible-connection /usr/bin/ansible-console /usr/bin/ansible-console-2 /usr/bin/ansible-console-2.7 /usr/bin/ansible-doc /usr/bin/ansible-doc-2 /usr/bin/ansible-doc-2.7 /usr/bin/ansible-galaxy /usr/bin/ansible-galaxy-2 /usr/bin/ansible-galaxy-2.7 /usr/bin/ansible-inventory /usr/bin/ansible-playbook #Ansible程序剧本执行命令 /usr/bin/ansible-playbook-2 /usr/bin/ansible-playbook-2.7 /usr/bin/ansible-pull /usr/bin/ansible-pull-2 /usr/bin/ansible-pull-2.7 /usr/bin/ansible-test /usr/bin/ansible-vault /usr/bin/ansible-vault-2 /usr/bin/ansible-vault-2.7 3.检查Ansible版本 [root@m01 ~]# ansible --version ansible 2.9.6 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是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Options:
-a MODULE_ARGS, --args=MODULE_ARGS
#module arguments
#指定执行模块使用的参数
--ask-vault-pass
#ask for vault password
#加密playbook文件时提示输入密码
-B SECONDS, --background=SECONDS
#run asynchronously, failing after X seconds(default=N/A)
#后台运行超时时间,异步运行,X秒之后失败
-C, --check
#don't make any changes; instead, try to predict some of the changes that may occur
#模拟执行,不会真正在机器上执行(查看执行会产生什么变化)
-D, --diff
#when changing (small) files and templates, show the differences in those files; works great with --check
#当更新的文件数及内容较少时,该选项可显示这些文件不同的地方,该选项结合-C用会有较好的效果
-e EXTRA_VARS, --extra-vars=EXTRA_VARS
#set additional variables as key=value or YAML/JSON
#执行命令时添加额外参数变量
-f FORKS, --forks=FORKS
#specify number of parallel processes to use(default=5)
#并行任务数。FORKS被指定为一个整数,默认是5
-h, --help
#show this help message and exit
#打开帮助文档API
-i INVENTORY, --inventory-file=INVENTORY
#specify inventory host path(default=/etc/ansible/hosts) or comma separated host list.
#指定要读取的Inventory文件
-l SUBSET, --limit=SUBSET
#further limit selected hosts to an additional pattern
#限定执行的主机范围
--list-hosts
#outputs a list of matching hosts; does not execute anything else
#列出执行匹配到的主机,但并不会执行
-m MODULE_NAME, --module-name=MODULE_NAME
#module name to execute (default=command)
#指定执行使用的模块,默认使用 command 模块
-M MODULE_PATH, --module-path=MODULE_PATH
#specify path(s) to module library (default=None)
#要执行的模块的路径
--new-vault-password-file=NEW_VAULT_PASSWORD_FILE
#new vault password file for rekey
#
-o, --one-line
#condense output
#压缩输出,摘要输出.尝试一切都在一行上输出
--output=OUTPUT_FILE
#output file name for encrypt or decrypt; use - for stdout
#
-P POLL_INTERVAL, --poll=POLL_INTERVAL
#set the poll interval if using -B (default=15)
#设置轮询间隔,每隔数秒。需要- B
--syntax-check
#perform a syntax check on the playbook, but do not execute it
#检查Playbook中的语法书写
-t TREE, --tree=TREE
#log output to this directory
#将日志内容保存在该输出目录,结果保存在一个文件中在每台主机上
--vault-password-file=VAULT_PASSWORD_FILE
#vault password file
#
-v, --verbose
#verbose mode (-vvv for more, -vvvv to enable connection debugging)
#执行详细输出
--version
#show program's version number and exit
#显示版本
Connection Options:
control as whom and how to connect to hosts
-k, --ask-pass
#ask for connection password
#
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
#use this file to authenticate the connection
#
-u REMOTE_USER, --user=REMOTE_USER
#connect as this user (default=None)
#指定远程主机以USERNAME运行命令
-c CONNECTION, --connection=CONNECTION
#connection type to use (default=smart)
#指定连接方式,可用选项paramiko (SSH)、ssh、local,local方式常用于crontab和kickstarts
-T TIMEOUT, --timeout=TIMEOUT
#override the connection timeout in seconds(default=10)
#SSH连接超时时间设定,默认10s
--ssh-common-args=SSH_COMMON_ARGS
#specify common arguments to pass to sftp/scp/ssh (e.g.ProxyCommand)
#
--sftp-extra-args=SFTP_EXTRA_ARGS
#specify extra arguments to pass to sftp only (e.g. -f, -l)
#
--scp-extra-args=SCP_EXTRA_ARGS
#specify extra arguments to pass to scp only (e.g. -l)
#
--ssh-extra-args=SSH_EXTRA_ARGS
#specify extra arguments to pass to ssh only (e.g. -R)
#
Privilege Escalation Options:
control how and which user you become as on target hosts
-s, --sudo
#run operations with sudo (nopasswd) (deprecated, use become)
#相当于Linux系统下的sudo命令
-U SUDO_USER, --sudo-user=SUDO_USER
#desired sudo user (default=root) (deprecated, use become)
#使用sudo,相当于Linux下的sudo命令
-S, --su
#run operations with su (deprecated, use become)
#
-R SU_USER, --su-user=SU_USER
#run operations with su as this user (default=root) (deprecated, use become)
#
-b, --become
#run operations with become (does not imply password prompting)
#
--become-method=BECOME_METHOD
#privilege escalation method to use (default=sudo),valid choices: [ sudo | su | pbrun | pfexec | doas |dzdo | ksu | runas ]
#
--become-user=BECOME_USER
#run operations as this user (default=root)
#
--ask-sudo-pass
#ask for sudo password (deprecated, use become)
#
--ask-su-pass
#ask for su password (deprecated, use become)
#
-K, --ask-become-pass
#ask for privilege escalation password
#
Ansible被管理节点
安装如下依赖软件 [root@web01 ~]# yum install epel-release libselinux-python -y
Ansible批量管理方式
1. 传统的密码认证
2. 密钥管理
Ansible配置文件
1.备份旧配置文件
cp /etc/ansible/hosts{,.bak}
2.添加被管理机器的ip地址
[root@m01 ~]# tail -3 /etc/ansible/hosts
[chaoge]
192.168.178.111
192.168.178.110
SSH密码认证批量管理主机
Ansible是直接利用本地SSH以及一些远程SSH服务作为客户端的,且基本上客户端的SSH服务默认都是开启的,无需额外配置。
1.在m01机器,执行ansible命令批量远程管理 [root@m01 ~]# ansible chaoge -m command -a "hostname" -k -u root SSH password: 192.168.178.111 | FAILED | rc=-1 >> Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host. 192.168.178.110 | FAILED | rc=-1 >> Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host.
【错误解释】

【解决办法】
1.手动访问客户端机器,生成指纹密钥 [root@m01 ~]# ssh root@192.168.178.110 The authenticity of host '192.168.178.110 (192.168.178.110)' can't be established. ECDSA key fingerprint is SHA256:KWavzpTvLG/Eg/DbO0+oy8TBHJ4o1QUH8dWjY7VAQlc. ECDSA key fingerprint is MD5:7a:12:de:3b:ba:2f:3e:5c:f5:9d:07:2f:14:4f:bb:32. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.178.110' (ECDSA) to the list of known hosts. root@192.168.178.110's password: [root@m01 ~]# ssh root@192.168.178.111 'hostname' The authenticity of host '192.168.178.111 (192.168.178.111)' can't be established. ECDSA key fingerprint is SHA256:/dH+yX5xi4q40+GIr/bCAj8pwC4bS0fWRoMUY13xuXY. ECDSA key fingerprint is MD5:81:00:96:f0:4c:f6:d3:71:3a:dc:18:16:08:d4:55:7f. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.178.111' (ECDSA) to the list of known hosts. root@192.168.178.111's password:
【配置免密登录客户端机器,批量管理】
每次执行ansible命令都要输出root的用户密码,如果主机密码不一致,还得输入多次
可以在/etc/ansible/hosts 主机列表文件中添加指定配置参数,实现远程管理主机的效果
Ansible软件使用的前提是SSH+KEY免密验证的环境,如果没有配置也可以使用Ansible,如下
1.修改/etc/ansible/hosts文件,在文件中定义主机密码 [root@m01 ~]# tail -3 /etc/ansible/hosts [chaoge] 192.168.178.111 ansible_ssh_user=root ansible_ssh_pass=111111 192.168.178.110 ansible_ssh_user=root ansible_ssh_pass=111111
SSH密钥方式批量管理主机
此方法比起SSH密钥登录更为安全方便
1.在m01管理机创建SSH密钥对 [root@m01 ~]# ssh-keygen -f ~/.ssh/id_rsa -P "" > /dev/null 2>&1 2.检查公私钥文件 [root@m01 ~]# ll ~/.ssh/ 总用量 16 -rw-------. 1 root root 394 3月 10 23:41 authorized_keys -rw------- 1 root root 1675 3月 16 23:13 id_rsa -rw-r--r-- 1 root root 390 3月 16 23:13 id_rsa.pub -rw-r--r-- 1 root root 354 3月 16 22:52 known_hosts
编写脚本,把ssh服务创建的公钥信息分发到客户端机器
Yum install sshpass -y
1.编写脚本如下
[root@m01 ~]# cat /server/scripts/distribution.sh
#!/bin/bash
rm -rf ~/.ssh/id_rsa*
ssh-keygen -f ~/.ssh/id_rsa -P "" > /dev/null 2>&1
SSH_Pass=111111
Key_Path=~/.ssh/id_rsa.pub
for ip in 110 111
do
sshpass -p$SSH_Pass ssh-copy-id -i $Key_Path "-o StrictHostKeyChecking=no" 192.168.178.$ip
done
# 非交互式分发公钥命令需要用sshpass指定SSH密码,通过-o StrictHostKeyChecking=no 跳过SSH连接确认信息
2.执行脚本,快速分发公钥,实现免密登录
[root@m01 ~]# sh /server/scripts/distribution.sh
总结
再生产环境下,ansible管理连接方式二选一即可
要求下更高的化,采用普通用户管理再提权限管理
主机连接安全性上,若是用了密钥管理,那么对于管理机的安全性就得严格把控,最好禁止SSH外网连接,启用内网VPN连接,加强安全性,否则管理机被入侵,对于客户端机器是很危险的。
Ansible批量管理模式与命令
Ansible实现批量管理主机的模式有主要两种:
1. 利用ansible命令实现批量管理(ad-hoc)模式
2. 利用ansible剧本实现批量管理(playbook)模式
【Ansible命令】

Ansible-doc命令
# 模块支持的有3000+数量 [root@m01 ~]# ansible-doc -l # 查看某个模块的具体用法 [root@m01 ~]# ansible-doc -s command
Ansible官网:https://docs.ansible.com/

浙公网安备 33010602011771号