- 自动化运维
- ansible介绍
- ansible实践部署
- 安装ansible所需的系统模块
- 也可以通过如下命令查看连接服务器的指纹信息
- !/bin/bash
- 非交互式分发公钥命令需要sshpass指定SSH密码,通过 -o StrictHostKeyChenking=no 跳过SSH连接确认信息
- 此时在m01机器上再连接客户端机器,就无须输入账号密码了,可以尝试使用ansible命令进行连接
- ansible模式与命令
- ad-hoc命令
- 返回主机名
- ansible-doc命令
- ansible模块
- 需要执行的脚本,必须要求在客户端机器上存在,否则会报错文件不存在,这是shell模块的特点,是因为还有一个专门执行脚本的script模块
- 创建需要数据复制的user group,批量创建用户 用户组,通过command模块或者shell模块,远程的执行命令
- 批量拷贝文件,发布给客户端节点
- 远程检查拷贝后的文件信息
- 批量远程的生产文件和内容
- 批量复制文件,备份
- 此时应该会产生一个day.txt文件是以最后命令为内容的,而第一次产生的day.txt文件则会加上时间备份信息,作为一个备份文件
- 验证文件夹是否存在,以及权限查看
- 目标文件不存在,则不执行动作,这是state的file属性
- 应该使用state的touch属性
- 查看文件更改后情况
- 源文件绝对路径,软连接绝对路径
- 验证该软连接
- 这个命令,注意不要在服务器上随便敲,因为服务器不得任意更新一些服务版本,可能会造成服务挂掉
- 远程查看crond服务是否正常
- 检查crond服务是否开机器自启
- 通过systemd模块管理服务
- 检查客户端机器,nginx是否安装
- 启动nginx服务
- 查看定时任务是否添加
- ansible剧本
- 定义被管理主机的ip地址
- 定义被管理主机的主机名字
- 定义多个主机信息
- 定义所有主机
- 定义task方式一:采用变量形式设置任务
- 当传入的参数过长的时候,我们还可以将其分割
- 方式二:采用字典形式设置多个任务
- 可以使用绝对或相对路径
自动化运维
人工运维时代
运维人员早期需要维护数量众多的机器,因此需要执行反复,重复的劳动力,很多机器需要同时部署的服务或是执行相同的命令,还得反复的登录不同的机器,执行重复的动作。
比如说要在backup服务器配置rsync服务,进行数据同步的操作,那么客户端都得单独的安装一下rsync命令工具才能使用。
可能需要一台台机器去登录,安装rsync之后,退出,登录下一个机器,可以是用xsheel等工具,快捷的创建ssh登录,但还是属于人工运维,效率比较低。
自动化运维时代
早期运维人员会结合ssh免密登录以及shell脚本来完成自动化的部署操作。
系统管理员面临的问题主要是,配置管理系统,远程执行命令,批量安装服务,启停服务等等。
后来也就诞生了众多的开源软件,自动化运维软件
- fabric
- puppet
- saltstack
- chef
- Ansible
其中有两款软件是基于python语言开发的,saltstack,ansible都是基于python编写。
自动化运维趋势
人肉运维,人力运维>自动化运维>数据化运维,可视化运维>AI智能运维,devops
自动化运维的好处
- 提高工作效率,减少重复性的劳动力操作
- 大大的减少了人为出错的可能性
- ansible支持数据化管理,数据化追源,找到问题的来源点
ansible介绍
ansible是一个同时管理多个远程主机的软件,必须是任意可以通过ssh登录的机器,因此ansible可以管理的机器如:
- 远程虚拟机
- 物理机
- 也可以直接管理本机机器
ansible通过ssh协议实现了,管理节点,被管理节点的通信。
只能通过ssh协议登录的主机,就可以完成ansible自动化部署操作。
- 批量文件分发
- 批量数据复制
- 批量数据修改、删除
- 批量自动化安装软件服务
- 批量服务启停
-
ansible特点
ansible的编排引擎可以出色的完成各种任务配置管理,ansible在流程控制,资源部署等方便很强大,并且ansible无须安装客户端软件,管理简洁,使用yaml配置文件语法,功能强大,便于维护。
ansible是基于python语言开发的,主要由python的两个ssh处理模块,paramiko,以及PyYAML模块 安装部署简单
- 管理主机便捷,支持多台主机并行管理
- 无须安装被管理节点的客户端(no agent),且无须占用客户端的其他端口,仅仅使用ssh服务即可
- 不仅仅支持python,还支持其他语言的二次开发
- 不用root用户也可执行,降低系统权限
ansible实践部署
服务器准备
准备ansible管理机器
通过yum自动化安装,阿里云yum,epel源
yum install epel-release -y yum install ansible libselinux-python -y
检查ansible软件安装情况,查询配置文件和可执行命令
rpm -ql ansible | grep -E ‘^/etc|^/usr/bin’
检查ansible版本
ansible —version
准备ansible被管理机器
安装ansible所需的系统模块
yum install epel-release libselinux-python -y
ansible管理方式
ansible批量管理主机的方式主要有两种
- 传统的输入ssh密码验证
- 密钥管理
配置ansible配置文件,添加被管理机器的ip地址或者主机名
备份现有的配置文件
cp /etc/ansible/hosts{,.ori}
添加ansible需要管理的机器地址,添加如下信息
vim /etc/ansible/hosts
[chaoge] 192.168.47.130 192.168.47.131
ssh密码认证方式管理机器
ansible是直接利用linux本地的ssh服务,以及一些远程的ssh操作,一般情况下客户端的ssh服务默认都是开启的,无需额外管理
在m01机器上执行如下命令
-m 指定功能模块,默认就是command模块 -a 告诉模块需要执行的参数 -k 询问密码验证 -u 指定运行的用户
ansible chaoge -m command -a ‘hostname’ -k -u root
如上操作,一般默认情况下会有错误提示,需要执行如下动作,只需要手动ssh对主机进行一次连接,即可使用ansible命令操作了
ssh root@192.168.47.130 ssh root@192.168.47.131
也可以通过如下命令查看连接服务器的指纹信息
cat ~/.ssh/know_hosts
此时再执行ansible命令,输入对应密码,就可以让被管理的机器,执行我们想要的结果了
配置免密登录
每次执行ansible命令的时候,都需要输入ssh的认证密码,也就是root密码,如果不同的主机密码不一致,还得输入多次,因此我们可以配置如下的快捷登录方式
ansible自带的密码认证参数
在/etc/ansible/hosts文件中,定义好密码
参数
ansible_host 主机地址
ansible_port 端口,默认是22端口
ansible_user 认证的用户
ansible_ssh_pass 用户认证的密码
使用hosts文件的参数形式,来实行ssh认证修改hosts文件
[chaoge] 192.168.47.130 ansible = root ansible_ssh_pass=111111 192.168.47.131 ansible = root ansible_ssh_pass=111111
此时可以不需要输入密码,自动ssh验证通过
ansible chaoge -m command -a ‘hostname’
ssh密钥方式批量管理
这个方式比起hosts文件的密码参数来的更安全放心
在m01机器上创建ssh密钥对
ssh-keygen -f ~/.ssh/id_rsa -P “” > /dev/null 2>&1
此时检查公私钥文件

编写公钥分发脚本
!/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_ras.pub for ip in 130 131 do sshpass -p$SSH_Pass ssh-copy-id -i $Key_Path “-o StrictHostKeyChenking=no” 192.168.47.$ip done
非交互式分发公钥命令需要sshpass指定SSH密码,通过 -o StrictHostKeyChenking=no 跳过SSH连接确认信息
此时在m01机器上再连接客户端机器,就无须输入账号密码了,可以尝试使用ansible命令进行连接
ansible chaoge -m command -a “uname -a”
总结
在生产环境中,ansible的连接方式,二选一即可,最好是配置ssh公私钥免密登录,如果生产环境的要求更高,可以用普通用户去执行,再提权操作,sudo
ansible模式与命令
ansible实现批量化主机管理的模式,主要有两种
- 利用ansible的纯命令行实现的批量管理,ad-hoc模式
利用ansible的playbook剧本来实现批量管理,playbook剧本模式
ad-hoc模式
ansible的ad-hoc模式是ansible的命令行形式,也就是处理一些临时的,简单的任务,可以直接使用ansible的命令行来操作
临时批量查看被管理机器的内存情况,cpu负载情况,网络情况
-
playbook模式
ansible的playbook模式是针对比较具体,且比较大的任务,那么就得事先写好剧本
一键部署rsync备份服务器
- 一键部署lnmp环境
ad-hoc命令
ansible-doc命令
列出所有的ansible支持的模块
ansible-doc -l
查看某个模块的具体用法参数
ansible-doc -s command
ansible模块
command模块
作用:在远程节点上执行一个命令
ansible-doc -s command #查看该模块支持的参数
chdir:在执行明林之前,先通过cd进入该参数指定的目录
creates:在创建一个文件之前,判断该文件是否存在,如果存在了则跳过前面的东西,如果不存在则执行前面的动作
free_form:该参数可以输入任何的系统命令,实现远程执行和管理
removes :定义一个文件是否存在,如果存在了则执行前面的动作,如果不存在则跳过动作
command模块是ansible的默认基本模块,也可以省略不写,但是要注意下如下的问题
获取被管理机器的负载信息
ansible chaoge -m command -a “uptime”
客户端切换目录,再打印当前目录
ansible chaoge -m command -a “pwd chdir=/tmp/“
判断文件是否存在,存在则跳过,不存在则执行
ansible chaoge -m command -a “pwd creates=/opt”
判断文件是否存在,存在则执行,不存在则跳过
ansible chaoge -m command -a “ls /opt removes=/opt”
忽略告警信息
ansible chaoge -m command -a “chmod 000 /etc/hosts warn=False”
shell模块
作用:在远程机器上执行命令(复杂的命令)
了解模块用法的渠道
批量查询进程信息
ansible chaoge -m shell -a “ps -ef | grep vim | grep -v grep”
批量在客户端服务器,创建写入文件信息
ansible chaoge -m shell -a “echo 你真棒 > /tmp/heihei.txt”
批量脚本
需要执行的脚本,必须要求在客户端机器上存在,否则会报错文件不存在,这是shell模块的特点,是因为还有一个专门执行脚本的script模块
- 创建文件夹
- 创建sh脚本文件,写入脚本内容
- 赋予脚本可执行权限
- 执行脚本
- 忽略warning信息
ansible chaoge -m shell -a “mkdir -p /server/myscripts/;echo ‘hostname’ > /server/myscripts/hostname.sh;chmod +x /server/myscripts/hostname.sh;bash /server/myscripts/hostname.sh warn=False”
script模块
功能:把m01管理机器上的脚本远程的传输到被管理节点上去执行
比起shell模块,script模块功能更强大,在m01机器本地有一份脚本,就可以在所有管理节点上去运行
script案例
管理节点上创建脚本
echo -e “pwd\nhostname” > /myscripts/local_hostname.sh
授权
chmod +x /myscripts/local_hostname.sh
远程的批量执行脚本,且在客户端上不需要存在该脚本
ansible chaoge -m script -a “/myscripts/local_hostname.sh”
- 利用script模块,可以批量让所有被管理的机器执行脚本,且该脚本不需要在客户端上存在
copy模块
作用:复制文件数据到远程主机
ansible-doc -s copy #查看copy模块的参数用法
copy模块是远程推送数据的模块,只能把管理节点上的数据,推送给远程节点,无法拉取数据到本地。
copy案例
把m01上的文件数据,发给被管理节点
创建需要数据复制的user group,批量创建用户 用户组,通过command模块或者shell模块,远程的执行命令
ansible chaoge -m command -a “useradd learn_ansible” ansible chaoge -m command -a “id learn_ansible”
批量拷贝文件,发布给客户端节点
ansible chaoge -m copy -a “src=/etc/hosts dest=/tmp/m01_hosts own=learn_ansible group=learn_ansible mode=0666”
远程检查拷贝后的文件信息
ansible chaoge -m command -a “ls -l /tmp/m01_hosts”
远程批量复制文件,备份,追加内容
批量远程的生产文件和内容
ansible chaoge -m shell -a “echo 12345 > /tmp/day.txt”
批量复制文件,备份
ansible chaoge -m copy -a “content=’hello word’ dest=/tmp/day.txt backup=yes”
此时应该会产生一个day.txt文件是以最后命令为内容的,而第一次产生的day.txt文件则会加上时间备份信息,作为一个备份文件
file模块
作用:创建,修改文件,目录的属性
ansible-doc -s file #查看模块详细信息与用法
file模块常用的参数解释:
group:定义文件/目录的属组
owner:定义属主
mode:定义权限
path:必选参数,定义文件路径
src:定义源文件路径,主要用于创建link类型文件使用
dest:创建出来的软连接,它的路径
state 参数:
file:如果目标文件不存在,那么不会创建该文件
touch:如果文件不存在,则创建一个新的文件,如果文件存在了,则修改它最后的修改时间
directory:如果目录不存在,那么会创建目录
link:用于创建软连接类型
absent:删除目录,文件或者取消连接
远程的批量创建文件夹,并且设置权限是666
ansible chaoge -m file -a “dest=/tmp/cc_dir/ mode=666 state=directory”
验证文件夹是否存在,以及权限查看
ansible chaoge -m shell -a “ls -ld /tmp/cc_dir”
远程批量生成文件
目标文件不存在,则不执行动作,这是state的file属性
ansible chaog -m file -a “dest=/tmp/cc_666.txt state=file owner=chaoge group=chaoge mode=600”
应该使用state的touch属性
ansible chaog -m file -a “dest=/tmp/cc_666.txt state=touch owner=chaoge group=chaoge mode=600”
查看文件更改后情况
ansible chaoge -m shell -a “ls -l /tmp/cc_666.txt”
远程创建软连接
源文件绝对路径,软连接绝对路径
ansible chaoge -m file -a “src=/etc/hosts dest=/tmp/ansible_hosts_test state=link”
验证该软连接
ansible chaoge -m shell -a “ls -l /tmp/ansible_hosts_test”
yum模块
yum案例
批量检查所有被管理节点是否安装了nginx服务
ansible chaoge -m shell -a “rpm -qa nginx warn=false”
通过yum模块批量安装服务
ansible chaoge -m yum -a “name=nginx state=installed”
批量远程卸载nginx
ansible chaoge -m yum -a “name=nginx state=absent”
升级软件包
ansible chaoge -m yum -a “name=nginx state=latest”
升级系统所有软件包,排除某个服务不升级
这个命令,注意不要在服务器上随便敲,因为服务器不得任意更新一些服务版本,可能会造成服务挂掉
ansible chaoge -m yum -a “state=latest name=’*’ exclude=’nginx’”
service/systemd模块
service命令 —— centos6
systemctl命令 —— centos7
systemd模块
name 指定服务的名字,如 nginx.service , crond.service
state 填入要执行的操作,如 reloaded , restarted , started
enabled 指定服务开机自启 systemctl enable nginx
daemon_reload 每当修改了配置文件,使用systemd重读配置文件
案例
管理crond服务
远程查看crond服务是否正常
ansible chaoge -m shell -a “systemctl status crond” | grep Active
检查crond服务是否开机器自启
ansible chaoge -m shell -a “systemctl list-unit-files” | grep crond
通过systemd模块管理服务
ansible chaoge -m systemd -a “name=crond state=stopped” ansible chaoge -m systemd -a “name=crond state=started” ansible chaoge -m systemd -a “name=crond state=restarted” ansible chaoge -m systemd -a “name=crond state=reloaded”
管理nginx服务
检查客户端机器,nginx是否安装
ansible chaoge -m shell -a “rpm -qa nginx”
启动nginx服务
ansilbe chaoge -m systemd -a “name=nginx state=started enabled=yse” ansilbe chaoge -m systemd -a “name=nginx state=stopped enabled=no” ansilbe chaoge -m systemd -a “name=nginx state=restated” ansilbe chaoge -m systemd -a “name=nginx state=reloaded”
cron模块
crond服务,定时任务
ansible —- cron模块
cron模块主要是管理linux的定时任务条目
cron案例
添加定时任务,每5分钟进行时间同步
ansible chaoge -m cron -a “name=ntp_cron job=’/usr/sbin/ntpdate ntp.aliyun.com > /dev/null 2>&1’ minute=*/5 “
查看定时任务是否添加
ansible chaoge -m shell -a “crontab -l”
添加定时任务,每个月3号,13号,早上8点整,重启nginx
ansible chaoge -m cron -a “name=restart_nginx job=’/usr/bin/systemctl restart nginx’ minute=0 hour=8 day=3,13 “
删除定时任务,只能删除通过ansible模块添加的任务记录
ansible chaoge -m cron -a “name=’restart_nginx’ state=absent”
ansible剧本
ansible核心功能,作用就是进行配置管理
ansible需要编写的playbook剧本需要遵循一定的规则,格式,这个格式就称之为yaml语法
# install nginx yaml,by chaoge- hosts: alltasks:- name: Install nginx serviceyum: name=nginx state=present- name: Copy Nignx.conf to every_servercopy: src=./nginx.conf dest=/etc/nginx/conf/nginx.conf mode=644
- 注意缩进的对齐,空格的数量
-
playbook剧本的组成规范
剧本很重要的就是,定义演员的信息(其实就是定义主机的信息),演员的具体任务(以及主机要执行的模块,动作)。
ansible的剧本也是由两个最基本的部分组成的 hosts定义的被管理的主机列表信息
- tasks关键词定义的被管理主机需要执行的动作
剧本之hosts部分
```yaml定义被管理主机的ip地址
- host: 192.168.47.130
task:
- name: 任务1 yum: …
定义被管理主机的主机名字
- host: backup1
task:
- name: 任务1 yum: …
定义多个主机信息
- host: 192.168.47.130,192.168.47.131,backup01
task:
- name: 任务1 yum: …
定义所有主机
host: all task:
- name: 任务1
yum: …
```
- name: 任务1
yum: …
定义被管理的主机,有一个重要的前提,就是被管理的主机,必须在ansible管理的hosts文件中有对应的信息,否则识别不了/etc/ansible/hosts
剧本之tasks讲解
变量形式定义task任务,name=”chuan” age=22
- 还可以使用字典形式定义,特点是key:value
```yaml
定义task方式一:采用变量形式设置任务
task:
方式二:采用字典形式设置多个任务
task:
- name: copy file to client…
copy:
src: /etc/ansible/hosts
dest: /etc/ansible/hosts
owner: root
group: root
mode: 0644
```
yaml语法规范
在学习ansible的时候,编写playbook是最重要的环节,那么playbook是遵循yaml语法,因此需要掌握他的数据格式目前主流使用的数据格式 有json xml yaml 都属于数据序列化格式 yaml更容易被解析,已读,因此更多的使用在了配置文件当中 ansible saltstack k8s
yaml基础语法
- 大小写敏感
- 使用缩进表示层级的关系(同样的空格数量)
- 在配置缩进关系的时候,禁止用tab键,一个一个空格表示
- 相同元素的左侧空格数目不重要,只需要对齐即可
yaml语法支持的数据结构
- 对象
- 数组
playbook编写案例
剧本编写完成之后,还得执行才能工作
在ansible程序中,加载模块的功能可以直接使用ansible adhoc命令行形式执行
加载剧本中的功能,可以使用ansible-playbook命令去执行脚本
基础执行语法
可以使用绝对或相对路径
ansible-playbook nginx.yaml
查看剧本的执行详细输出
ansible-playbook nginx.yaml —verbose
查看剧本影响的主机列表信息
ansible-playbook nginx.yaml —list-hosts
执行剧本加载指定的主机清单文件,默认剧本使用的是/etc/ansible/hosts
ansible-playbook nginx.yaml -i /etc/my_ansible/hosts
执行剧本并且检查语法
ansible-playbook nginx.yaml —syntax-check
调试剧本,不会对被管理节点发生改变
ansible-playbook nginx.yaml -C
playbook部署rsync服务
rsync部署过程思路
- 安装rsync服务,使用yum
- 编写rsync配置文件(常用的操作是,在m01管理机器上编写好配置文件,分发给客户端机器即可)copy模块
- 创建rsync用户,使用ansible的user模块
- 创建用于rsync验证的文件,还是选择在m01上写好后分发,copy模块,注意文件权限设置
- 创建数据备份的文件夹,rsync指定了backup模块,备份的目录是/data_backup/,调用file模块创建文件夹
- 启动rsync服务端,且是守护进程模式,shell模块,systemd模块 ```yaml
hosts: 192.168.47.130 tasks:
name: step01,install rsync service yum: name=rsync state=installed
name: step02,edit rsync conf file copy: src=/etc/ansible/rsync_conf/rsyncd.conf
dest=/etc/rsync/conf/
name: step03,create user rsync user: name=rsync state=present createhome=no
shell=/sbin/nologin
name: step04,create user rsync copy: src=/etc/ansible/rsync_conf/rsync.password
dest=/etc/rsync/conf/ mode=0600
name: step05,create backup dir file: dest=/date_backup/ state=directory
owner=rsync group=rsync
name: step06,run rsync server shell: rsync —daemon creates=/var/run/rsync.pid ```
