Ansible自动化运维

一、abstract-简介
1、LOGO

langchain 自动化运维agent_帮助手册


ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,

实现了批量系统配置、批量程序部署、批量运行命令等功能。

无客户端。

2、工作原理

langchain 自动化运维agent_运维_02

二、Ansible安装部署
1、准备环境
环境:所有机器关闭防火墙和selinux
主机:4台  1个控制节点 3个被控制节点
解析:本地互相解析(所有机器)
# vim /etc/hosts
192.168.1.10 host1
192.168.1.11 host2
192.168.1.12 host3
192.168.1.9  ansible-server  (控制节点服务器端)
配置ssh公钥认证:控制节点需要发送ssh公钥给所有被控制节点
[root@ansible-server ~]# ssh-keygen
[root@ansible-server ~]# ssh-copy-id -i 192.168.1.10  #所有被控节点机器
2、安装Ansible
阿里yum源安装:
cat >/etc/yum.repos.d/epel-7.repo<<EOF
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=http://mirrors.aliyun.com/epel/7/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0

[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=http://mirrors.aliyun.com/epel/7/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0
EOF
#yum -y install ansible
官方epel源
# yum install -y epel-release
# yum install -y ansible
# ansible --version   //查看版本
# ansible --help      //查看帮助
# rpm -ql ansible     //列出所有文件
# rpm -qc ansible     //查看配置文件
# ansible-doc -l      //查看所有模块
# ansible-doc -s yum  //看yum模块,了解其功能
三、Ansible基础
1、定义主机清单
# vim /etc/ansible/hosts    //在配置文件最下方追加主机名
host1
host2
host3
2、测试连通性
# ansible  host1 -m ping  //测试Ansible与被管理主机的连通性,-m是指模块
# ansible  host1 -m ping -0  //简洁输出,一行
3、know_hosts
# ansible host2 -m ping -u root -k -o   //增加用户名选项,增加密码选项
# vim /etc/ssh/ssh_config  //修改ssh配置文件去掉(yes/no)的询问
StrictHostKeyChecking no
# sysyemctl restart sshd   //重启ssh
4、ping和ssh的区别

ping:是ICMP网际消息管理协议,ssh是应用层安全登录程序,关闭host1主机的ssh进程,进行ping连通性测试成功。使用ansible对host1进行联通测试,却是失败的。

总结:ping的通,ssh不一定联的通,ansible的ping,是探测ssh程序是否连接。不是icmp协议

四、inventory-主机清单
1、含义:清查;存货清单;财产目录;主机清单
2、增加主机组

官方链接:http://docs.ansible.com/ansible/intro_inventory.html#

# vim /etc/ansible/hosts   //直接在主机的上方添加中括号代表组名
[webserver]         //使用[]标签指定主机组 ----标签自定义
host1
host2
host3
[root@localhost ~]# ansible webserver -m ping -u root -k -o
SSH password: 
host3 | SUCCESS => {"changed": false, "ping": "pong"}
host1 | SUCCESS => {"changed": false, "ping": "pong"}
host4 | SUCCESS => {"changed": false, "ping": "pong"}
host2 | SUCCESS => {"changed": false, "ping": "pong"}
3、增加用户名,密码
# vim /etc/ansible/hosts
[webserver]         
host1   ansible_ssh_user='root' ansible_ssh_pass='111111'
host2   ansible_ssh_user='root' ansible_ssh_pass='111111'
host3   ansible_ssh_user='root' ansible_ssh_pass='111111'
也可以用正则方法:
host[1:4] ansible_ssh_user='root' ansible_ssh_pass='111111'
[root@localhost ~]# ansible webserver -m ping -o  //测试面用户名和密码设置成功
4、增加端口
# ss -anpt | grep sshd    //查看默认端口号
LISTEN   0   128         *:22                  *:*       users:(("sshd",pid=976,fd=3))
ESTAB    0    0  192.168.239.129:22  192.168.239.1:56164   users:(("sshd",pid=3739,fd=3))
LISTEN   0   128       [::]:22                 [::]:*      users:(("sshd",pid=976,fd=4))
# vim /etc/ssh/sshd_config      //修改默认端口号
port  2222
# systemctl restart sshd      //重启ssh
# ansible host1 -m ping -o    #访问会报错
# vim /etc/ansible/hosts     //修改主机访问端口号
host1   ansible_ssh_user='root' ansible_ssh_pass='111111' ansible_ssh_port='2222'
# ansible host1 -m ping -o  #访问成功
5、组定义:变量
# vim /etc/ansible/hosts
[webserver]         
host1  ansible_ssh_port='2222'    //特殊的单独定义
[webserver:vars]   //定义组变量
ansible_ssh_user='root'
ansible_ssh_pass='111111'

常用变量:

langchain 自动化运维agent_vim_03

6、子分组

将不同的分组进行组合

# vim /etc/ansiable/hosts
[apache]
host[1:2]
[nginx]
host[3:4]
[webserver:children]    //定义组与组之间的组合
apache
nginx
[webserver:vars]
ansible_ssh_user='root'
ansible_ssh_pass='666666'
如有需要让Nginx和apach组操作时直接访问webserver即可
# ansible webserver -m ping -o
7、自定义主机列表
# vim hostlist    //自定义一个文件
[dockers]
host1
host2
[dockers:vars]
ansible_ssh_user='root'
ansible_ssh_pass='111111'
# ansible -i /hostlist dockers -m ping -o     //-i是调用一个路径下的一个hostlist的文件(跟绝对路径),dockers是组名
-i:指定清单文件
小注释:如果不通,手动连接第一次,第一次需要手动输入密码。"第一次"
五、Ad-Hoc-点对点模式
简介:临时的在ansible中是指需要快速执行的单挑命令,并且不需要保存的命令,对于复杂的命令则为playbook.
1、copy模块(帮助手册ansible-doc copy)
模块参数:src=sourc"指定源文件路径"  owner:指定属主    group:指定属组 dest=destination"目标地址"(拷贝到的地方)   mode:指定权限  
backup:再覆盖之前原文件备份(备份文件包含时间信息)有yes/no两个选项
[root@ansible-server ~]# vim a.txt  #创建一个测试文件
123123
[root@ansible-server ~]# ansible weball -m copy -a 'src=/root/a.txt dest=/opt owner=root group=root mode=644' -o
[root@ansible-server ~]# vim a.txt  #追加如下内容
123123
234234
[root@ansible-server ~]# ansible weball -m copy -a 'src=/root/a.txt dest=/opt/ owner=root group=root mode=644 backup=true' -o
注释:如果文件没有变化,不会备份。只有文件内容不同,才会做备份。(-a修饰符)
登录被控制机器其中一台查看
[root@ansible-web1 ~]# cat /opt/a.txt.15301.2019-09-01\@00\:35\:18~

[root@ansible-server ~]# ansible weball -m shell -a 'mv /mnt/qf.txt /tmp' -o
移动被控制节点的文件
2、用户模块(帮助手册ansible-doc user)
创建用户
[root@ansible-server ~]# ansible weball -m user -a 'name=qf state=present'  //创建用户
登录到被管理主机查看是否创建成功或观看管理主机操作回显
修改密码
[root@ansible-server ~]# echo '111111' | openssl passwd -1 -stdin   //生成加密密码值$1$XVzsJMDr$5wI4oUaQ.emxap6s.N27
注:openssl用于加密,-1是密码的类型(数值越复杂),stdin是标准输入输出
[root@ansible-server ~]# ansible weball -m user -a 'name=qf password="$1$XVzsJMDr$5wI4oUaQ.emxap6s.N27"' //修改密码
修改shell(默认登录shell是bin/bash)
[root@ansible-server ~]# ansible weball -m user -a 'name=qf shell=/sbin/nologin append=yes'     //append追加修改
改变shell路径后用户则登录不上
删除用户
[root@ansible-server ~]# ansible weball -m user -a 'name=qf state=absent'    //删除用户
3、软件包管理模块(帮助手册ansiable-doc yum)
state=     #状态是什么,干什么
state=absent       用于remove安装包
state=latest       表示最新的
state=removed      表示卸载
[root@ansible-server ~]# ansible host1 -m yum -a 'name="*" state=latest'  //升级所有包
[root@ansible-server ~]# ansible host2 -m yum -a 'name="httpd" state=latest'    //安装apache
[root@ansible-server ~]# yum list | grep httpd   //查看是否安装成功
[root@ansible-server ~]# ansible host2 -m yum -a 'name="httpd" state=absent'      //卸载apache
或
[root@ansible-server ~]# ansible host2 -m yum -a 'name="httpd" state=removed'
4、服务管理模块(帮助手册ansible-doc service)
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=started" #启动
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=stopped" #停止
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=restarted" #重启
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=started enabled=yes" #开机启动
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=started enabled=no"  #开机关闭
5、文件模块(帮助手册ansible-doc file)
模块参数属性:  owner:修改属主    group:修改属组      mode:修改权限 path=:要修改文件的路径     recurse:递归的设置文件的属性,只对目录有效
yes:表示使用递归设置
state:状态
touch:创建一个新的空文件   directory:创建一个新的目录,当目录存在时不会进行修改
[root@ansible-server ~]# ansible webservers1 -m file -a 'path=/tmp/1.txt mode=777 state=touch'   //创建文件
[root@ansible-server ~]# ansible ansible-web2 -m file -a 'path=/tmp/2.txt mode=777 owner=nginx state=touch' //修改属主
[root@ansible-server ~]# ansible webservers1 -m file -a 'path=/tmp/qf mode=777 state=directory' //创建一个目录
6、收集模块:收集目标主机的信息(帮助手册ansible-doc setup)
[root@ansible-server ~]# ansible webservers1 -m setup  #收集所有信息
[root@ansible-server ~]# ansible webservers1 -m setup -a 'filter=ansible_all_ipv4_addresses' #只查询ipv4的地址
filter:过滤
7、shell模块(帮助手册ansible-doc shell)
shell模块能完成以上模块的所有功能
[root@ansible-server ~]# ansible webserver -m shell -a 'hostname' -o     //获取主机名
[root@ansible-server ~]# ansible webserver -m shell -a 'hostname' -o -f 2   //-f 2指定线程数(并发量比较大时使用)
[root@ansible-server ~]# ansible webserver -m shell -a 'yum -y install httpd' -o     //部署apache
[root@ansible-server ~]# ansible webserver -m shell -a 'uptime' -o    //查询系统负载