自动化运维

人工运维时代

运维人员早期需要维护数量众多的机器,因此需要执行反复,重复的劳动力,很多机器需要同时部署的服务或是执行相同的命令,还得反复的登录不同的机器,执行重复的动作。
比如说要在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管理机器

  1. 通过yum自动化安装,阿里云yum,epel源

    yum install epel-release -y yum install ansible libselinux-python -y

  2. 检查ansible软件安装情况,查询配置文件和可执行命令

    rpm -ql ansible | grep -E ‘^/etc|^/usr/bin’

  3. 检查ansible版本

    ansible —version

准备ansible被管理机器

安装ansible所需的系统模块

yum install epel-release libselinux-python -y

ansible管理方式

ansible批量管理主机的方式主要有两种

  • 传统的输入ssh密码验证
  • 密钥管理

配置ansible配置文件,添加被管理机器的ip地址或者主机名

  1. 备份现有的配置文件

    cp /etc/ansible/hosts{,.ori}

  2. 添加ansible需要管理的机器地址,添加如下信息

    vim /etc/ansible/hosts

    [chaoge] 192.168.47.130 192.168.47.131

ssh密码认证方式管理机器

ansible是直接利用linux本地的ssh服务,以及一些远程的ssh操作,一般情况下客户端的ssh服务默认都是开启的,无需额外管理

  1. 在m01机器上执行如下命令

    -m 指定功能模块,默认就是command模块 -a 告诉模块需要执行的参数 -k 询问密码验证 -u 指定运行的用户

    ansible chaoge -m command -a ‘hostname’ -k -u root

  2. 如上操作,一般默认情况下会有错误提示,需要执行如下动作,只需要手动ssh对主机进行一次连接,即可使用ansible命令操作了

    ssh root@192.168.47.130 ssh root@192.168.47.131

    也可以通过如下命令查看连接服务器的指纹信息

    cat ~/.ssh/know_hosts

  3. 此时再执行ansible命令,输入对应密码,就可以让被管理的机器,执行我们想要的结果了

    配置免密登录

    每次执行ansible命令的时候,都需要输入ssh的认证密码,也就是root密码,如果不同的主机密码不一致,还得输入多次,因此我们可以配置如下的快捷登录方式

    ansible自带的密码认证参数

    在/etc/ansible/hosts文件中,定义好密码
    参数
    ansible_host 主机地址
    ansible_port 端口,默认是22端口
    ansible_user 认证的用户
    ansible_ssh_pass 用户认证的密码
    使用hosts文件的参数形式,来实行ssh认证

  4. 修改hosts文件

    [chaoge] 192.168.47.130 ansible = root ansible_ssh_pass=111111 192.168.47.131 ansible = root ansible_ssh_pass=111111

  5. 此时可以不需要输入密码,自动ssh验证通过

    ansible chaoge -m command -a ‘hostname’

ssh密钥方式批量管理

这个方式比起hosts文件的密码参数来的更安全放心

  1. 在m01机器上创建ssh密钥对

    ssh-keygen -f ~/.ssh/id_rsa -P “” > /dev/null 2>&1

  2. 此时检查公私钥文件

image.png
编写公钥分发脚本

!/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命令

  1. 被管理机器返回命令

    返回主机名

    ansible chaoge -m command -a “hostname”

ansible-doc命令

  1. 列出所有的ansible支持的模块

    ansible-doc -l

  2. 查看某个模块的具体用法参数

    ansible-doc -s command

ansible模块

command模块

作用:在远程节点上执行一个命令

ansible-doc -s command #查看该模块支持的参数

chdir:在执行明林之前,先通过cd进入该参数指定的目录
creates:在创建一个文件之前,判断该文件是否存在,如果存在了则跳过前面的东西,如果不存在则执行前面的动作
free_form:该参数可以输入任何的系统命令,实现远程执行和管理
removes :定义一个文件是否存在,如果存在了则执行前面的动作,如果不存在则跳过动作
command模块是ansible的默认基本模块,也可以省略不写,但是要注意下如下的问题

  • 使用command模块,不得出现shell变量$name,也不得出现特殊符号><|:&,这些符号command模块是不能执行的,需要指定变量和特殊符号,就使用shell模块

    command案例

  1. 获取被管理机器的负载信息

    ansible chaoge -m command -a “uptime”

  2. 客户端切换目录,再打印当前目录

    ansible chaoge -m command -a “pwd chdir=/tmp/“

  3. 判断文件是否存在,存在则跳过,不存在则执行

    ansible chaoge -m command -a “pwd creates=/opt”

  4. 判断文件是否存在,存在则执行,不存在则跳过

    ansible chaoge -m command -a “ls /opt removes=/opt”

  5. 忽略告警信息

    ansible chaoge -m command -a “chmod 000 /etc/hosts warn=False”

shell模块

作用:在远程机器上执行命令(复杂的命令)
了解模块用法的渠道

  • linux命令行里面通过 ansible-doc
  • ansible官网查看帮助信息

    shell案例

  1. 批量查询进程信息

    ansible chaoge -m shell -a “ps -ef | grep vim | grep -v grep”

  2. 批量在客户端服务器,创建写入文件信息

    ansible chaoge -m shell -a “echo 你真棒 > /tmp/heihei.txt”

  3. 批量脚本

    需要执行的脚本,必须要求在客户端机器上存在,否则会报错文件不存在,这是shell模块的特点,是因为还有一个专门执行脚本的script模块

    1. 创建文件夹
    2. 创建sh脚本文件,写入脚本内容
    3. 赋予脚本可执行权限
    4. 执行脚本
    5. 忽略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案例

  1. 管理节点上创建脚本

    echo -e “pwd\nhostname” > /myscripts/local_hostname.sh

  2. 授权

    chmod +x /myscripts/local_hostname.sh

  3. 远程的批量执行脚本,且在客户端上不需要存在该脚本

    ansible chaoge -m script -a “/myscripts/local_hostname.sh”

  • 利用script模块,可以批量让所有被管理的机器执行脚本,且该脚本不需要在客户端上存在

copy模块

作用:复制文件数据到远程主机
ansible-doc -s copy #查看copy模块的参数用法
image.png
copy模块是远程推送数据的模块,只能把管理节点上的数据,推送给远程节点,无法拉取数据到本地。

copy案例

  1. 把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”

  2. 远程批量复制文件,备份,追加内容

    批量远程的生产文件和内容

    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:删除目录,文件或者取消连接

  • file模块主要用于创建文件,目录以及文件数据,或者对现有的文件,目录修改权限

    file案例

  1. 远程的批量创建文件夹,并且设置权限是666

    ansible chaoge -m file -a “dest=/tmp/cc_dir/ mode=666 state=directory”

    验证文件夹是否存在,以及权限查看

    ansible chaoge -m shell -a “ls -ld /tmp/cc_dir”

  2. 远程批量生成文件

    目标文件不存在,则不执行动作,这是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”

  3. 远程创建软连接

    源文件绝对路径,软连接绝对路径

    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模块

image.png

yum案例

  1. 批量检查所有被管理节点是否安装了nginx服务

    ansible chaoge -m shell -a “rpm -qa nginx warn=false”

  2. 通过yum模块批量安装服务

    ansible chaoge -m yum -a “name=nginx state=installed”

  3. 批量远程卸载nginx

    ansible chaoge -m yum -a “name=nginx state=absent”

  4. 升级软件包

    ansible chaoge -m yum -a “name=nginx state=latest”

  5. 升级系统所有软件包,排除某个服务不升级

    这个命令,注意不要在服务器上随便敲,因为服务器不得任意更新一些服务版本,可能会造成服务挂掉

    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重读配置文件

案例

  1. 管理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”

  2. 管理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案例

  1. 添加定时任务,每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”

  2. 添加定时任务,每个月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 “

  3. 删除定时任务,只能删除通过ansible模块添加的任务记录

    ansible chaoge -m cron -a “name=’restart_nginx’ state=absent”

ansible剧本

ansible核心功能,作用就是进行配置管理
ansible需要编写的playbook剧本需要遵循一定的规则,格式,这个格式就称之为yaml语法

  1. # install nginx yaml,by chaoge
  2. - hosts: all
  3. tasks:
  4. - name: Install nginx service
  5. yum: name=nginx state=present
  6. - name: Copy Nignx.conf to every_server
  7. copy: src=./nginx.conf dest=/etc/nginx/conf/nginx.conf mode=644
  • 注意缩进的对齐,空格的数量
  • 创建的文件格式后缀为 .yaml

    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: …
      ```
  • 定义被管理的主机,有一个重要的前提,就是被管理的主机,必须在ansible管理的hosts文件中有对应的信息,否则识别不了/etc/ansible/hosts

    剧本之tasks讲解

  • 变量形式定义task任务,name=”chuan” age=22

  • 还可以使用字典形式定义,特点是key:value ```yaml

    定义task方式一:采用变量形式设置任务

    task:
    • name: make sure apache is running service: name=http state=running
    • name: copy file.. copy: src=/etc/ansible/hosts
      1. dest=/etc/ansible/hosts
      2. owner=root group=root mode=644

      当传入的参数过长的时候,我们还可以将其分割

方式二:采用字典形式设置多个任务

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命令去执行脚本
  1. 基础执行语法

    可以使用绝对或相对路径

    ansible-playbook nginx.yaml

  2. 查看剧本的执行详细输出

    ansible-playbook nginx.yaml —verbose

  3. 查看剧本影响的主机列表信息

    ansible-playbook nginx.yaml —list-hosts

  4. 执行剧本加载指定的主机清单文件,默认剧本使用的是/etc/ansible/hosts

    ansible-playbook nginx.yaml -i /etc/my_ansible/hosts

  5. 执行剧本并且检查语法

    ansible-playbook nginx.yaml —syntax-check

  6. 调试剧本,不会对被管理节点发生改变

    ansible-playbook nginx.yaml -C

playbook部署rsync服务

rsync部署过程思路

  1. 安装rsync服务,使用yum
  2. 编写rsync配置文件(常用的操作是,在m01管理机器上编写好配置文件,分发给客户端机器即可)copy模块
  3. 创建rsync用户,使用ansible的user模块
  4. 创建用于rsync验证的文件,还是选择在m01上写好后分发,copy模块,注意文件权限设置
  5. 创建数据备份的文件夹,rsync指定了backup模块,备份的目录是/data_backup/,调用file模块创建文件夹
  6. 启动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

      1. dest=/etc/rsync/conf/
    • name: step03,create user rsync user: name=rsync state=present createhome=no

      1. shell=/sbin/nologin
    • name: step04,create user rsync copy: src=/etc/ansible/rsync_conf/rsync.password

      1. dest=/etc/rsync/conf/ mode=0600
    • name: step05,create backup dir file: dest=/date_backup/ state=directory

      1. owner=rsync group=rsync
    • name: step06,run rsync server shell: rsync —daemon creates=/var/run/rsync.pid ```