编辑
2022-05-09
ansible
00

目录

ansible介绍
一、ansible简介
1.1 ansible的功能
1.2 ansible的优点
1.3 ansible的缺点
1.4 ansible的安装
二、ansible的相关文件及常用选项
2.1 主配置文件
2.2 主机清单
2.3 常用配置选项
三、ansible常用模块
四、重点来了,ansible做自动化运维工具的最强工作:ansible-playbook
4.1 playbook组成
4.2 playbook格式
总结:这里讲了一些ansible的基础用法,当然ansible不止这些用法。基于ansible-playbook的role的用法可以批量部署一套LNMP架构,批量部署mysql、zabbix等服务。下次再和大家分享。

ansible介绍

一、ansible简介

ansible是一款基于python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible架构相对比较简单,仅需通过SSH连接客户机执行任务即可,不像Saltstack需要安装客户端,但是Saltstack的执行效率要比ansible高。工作中根据项目具体情况选择适合的运维工具。

1.1 ansible的功能

  • 批量执行远程命令,可以对远程的多台主机同时进行命令的执行
  • 批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务
  • 编排高级的企业级复杂的IT架构任务, Ansible的Playbook和role可以轻松实现大型的IT复杂架构
  • 提供自动化运维工具的开发API, 有很多运维工具,如jumpserver就是基于 ansible 实现自动化管理功能

1.2 ansible的优点

  • 功能丰富的模块:提供了多达数千个的各种功能的模块,完成特定任务只需调用特定模块即可,还支持自定义模块,可使用任何编程语言写模块
  • 使用和部署简单: 无需安装专用代理软件,基于python和SSH(默认已安装)实现
  • 安全: 基于OpenSSH实现安全通讯无需专用协议
  • 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性和模块有关
  • 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
  • 较强大的多层解决方案 Role
  • Python语言实现, 基于Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块
  • 属于红帽(IBM)公司产品,背景强大,未来发展前景光明

1.3 ansible的缺点

  • 如果管理的主机较多时,执行效率不如saltstack高
  • 当前还不支持像MySQL数据库一样的事务回滚

1.4 ansible的安装

  • 使用yum或者apt直接安装,安装完后使用ansible --version查看版本即可
  • 或者使用pip安装方法,需要先安装python3.X的包和rust包,然后使用pip install ansible即可

二、ansible的相关文件及常用选项

2.1 主配置文件

ansible的配置文件可以放在多个不同的地方,且优先级不同,默认是在/etc/ansible/ansible.cfg,且配置文件基本不用配置

优先级从高到低排序

1、ANSIBLE_CONFIG #环境变量,目录下的文件必须存在才能生效
2、./ansible.cfg #当前目录下的ansible.cfg,一般一个项目对应一个专用配置文件,推荐使用建议每个项目目录下,创建独有的ansible.cfg文件
3、~/.ansible.cfg #当前用户家目录下的.ansible.cfg
4、/etc/ansible/ansible.cfg #系统默认配置文件

2.2 主机清单

默认在/etc/ansible/hosts中,也可在ansible的每个项目中单独填写 主机清单配置文件:

yml
ansible_ssh_host #将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置. ansible_ssh_port #ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口 192.168.1.100:2222 ansible_ssh_user #默认的 ssh 用户名 ansible_ssh_pass #ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥) ansible_sudo_pass #sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass) ansible_sudo_exe (new in version 1.8) #sudo 命令路径(适用于1.8及以上版本) ansible_connection #与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前 默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行. ansible_ssh_private_key_file #ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理 的情况. ansible_shell_type #目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 'fish'. ansible_python_interpreter #目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的 Python.之所以不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).与 ansible_python_interpreter 的工作方式相同,可设定如 ruby perl 的路径.... 例: [test1] 10.0.0.2 ansible_ssh_port=33322 ansible_ssh_user=root ansible_ssh_pass=123456 [test2] 10.0.0.[20:30] 组嵌套 [test3] test1 test2 #对分组主机统一密码 #对每个分组的所有主机统一定义用户和密码,执行ansible命令时显示别名,如web01 [websrvs] web01 ansible_ssh_host=10.0.0.101 web02 ansible_ssh_host=10.0.0.102 [websrvs:vars] ansible_ssh_password=123456

2.3 常用配置选项

sh
--version #显示版本 -m module #指定模块,默认为command -a module-args,模块指令 一般跟在-m后,例:-m shell -a 'ls /data' -v #详细过程 -vv -vvv更详细 --list-hosts #显示主机列表,可简写 --list -C, --check #检查,并不执行 -T, --timeout=TIMEOUT #执行命令的超时时间,默认10s -k, --ask-pass #提示输入ssh连接密码,默认Key验证 -u, --user=REMOTE_USER #执行远程执行的用户,默认root -b, --become #代替旧版的sudo实现通过sudo机制实现提升权限 --become-user=USERNAME #指定sudo的runas用户,默认为root -K, --ask-become-pass #提示输入sudo时的口令 -f FORKS, --forks FORKS #指定并发同时执行ansible任务的主机数 -i INVENTORY, --inventory INVENTORY #指定主机清单文件 例: ansible all -m ping #默认以root用户只需ping ansible all -m ping -u zhang k #使用zhang用户执行ping检测并输入密码 ansible all -m ping -u zhang -k -b #使用zhang用户以sudo执行ping检测并输入密码 #俗话说要想运维干的好,帮助必须玩得溜,ansible-doc的帮助个人感觉写的很详细。还有很多范例 ansible-doc -s script #显示该模块的部分选项用法,无例子 ansible-doc script #全部显示,篇幅很长,有实例

三、ansible常用模块

截止到2022年,ansible已经有6000多个模块了,虽然模块众多,但是工作中常用的也就30来个,掌握常用的模块基本够用,而且使用到后期都使用ansible-playbook了,不会在一条命令一条命令去敲了。 这里挑几个常用的介绍一下。

  1. command 模块
    默认模块,在远程主机执行命令,可忽略 -m 选项 例: ansible centos7 -a 'cat /etc/issue'
    127.0.0.1 | CHANGED | rc=0 >> \S Kernel \r on an \m

提示

ansible提前和要控制的机器打通ssh-key验证,这样命令执行起来会很方便。不然还要每个主机输一次密码,不然自动化运维就成一句空话了。

  1. script模块
sh
script模块:在远程主机上执行ansible服务器的脚本(无需执行权限),此模块不具有幂等性 chdir=dir #执行命令前,先切换至目录dir cmd #指定ansible主机的命令 creates=file #当file不存在时才会执行 removes=file #当file存在时才会执行 例:ansible all -m script -a /data/test.sh
  1. copy模块
sh
功能:复制ansible服务器主控端或远程的本机的文件到远程主机 注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件 常见选项 范例: [root@ansible ~]#vim /etc/ansible/ansible.cfg #修改下面一行 module_name = shell chdir=dir #执行命令前,先切换至目录dir cmd #指定ansible主机的命令 creates=file #当file不存在时才会执行 removes=file #当file存在时才会执行 ansible websrvs -m script -a /data/test.sh src #控制端的源文件路径 dest #被控端的文件路径 owner #属主 group #属组 mode #权限 backup #是否备份 validate #验证成功才会执行copy remote_src #no是默认值,表示src文件在ansible主机,yes表示src文件在远程主机 #如目标存在,默认覆盖,此处指定先备 ansible websrvs -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh owner=wang mode=600 backup=yes" #指定内容,直接生成目标文件 ansible websrvs -m copy -a "content='wang 123456\nxiao 654321\n' dest=/etc/rsync.pas owner=root group=root mode=0600" #复制/etc目录自身,注意/etc/后面没有/ ansible websrvs -m copy -a "src=/etc dest=/backup" #复制/etc/下的文件,不包括/etc/目录自身,注意/etc/后面有/ ansible websrvs -m copy -a "src=/etc/ dest=/backup" #复制/etc/suders,并校验语法 ansible websrvs -m copy -a "src=/etc/suders dest=/etc/sudoers.edit remote_src=yes validate=/usr/sbin/visudo -csf %s"
  1. get_url模块
sh
功能:将文件用http、https或者ftp下载到被管理节点上 url #下载文件的URL,支持HTTP,HTTPS或FTP协议 dest #下载到目标路径(绝对路径),如果目标是一个目录,就用原文件名,如果目标设置了名称就用目标 设置的名称 owner #指定属主 group #指定属组 mode #指定权限 force #如果yes,dest不是目录,将每次下载文件,如果内容改变替换文件。如果no,则只有在目标不存 在时才会下载 checksum #对目标文件在下载后计算摘要,以确保其完整性 #示例: checksum="sha256:D98291AC[...]B6DC7B97", checksum="sha256:http://example.com/path/sha256sum.txt" url_username #用于HTTP基本认证的用户名。 对于允许空密码的站点,此参数可以不使用 `url_password' url_password #用于HTTP基本认证的密码。 如果未指定`url_username'参数,则不会使用 `url_password'参数 validate_certs #如果“no”,SSL证书将不会被验证。 适用于自签名证书在私有网站上使用 timeout #URL请求的超时时间,秒为单位 例: [root@ansible ~]#ansible websrvs -m get_url -a 'url=http://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/nginx.tar.gz checksum="md5:b2d33d24d89b8b1f87ff5d251aa27eb8"'
  1. yum模块
sh
功能:为远程主机安装软件包,也可配置yum源 选项: name #软件包名称 state #状态 =present #安装,此为默认值,可不加 =absent #删除 =latest #最新版 list #列出指定包 enablerepo #启用哪个仓库安装 disablerepo #不使用哪些仓库的包 exclude #排除指定的包 validate #是否检验,默认为yes 例:安装及卸载 ansible all -m yum -a 'name=tree' ansible all -m yum -a 'name=tree state=absent' #安装zabbix agent rpm包 [root@ansible ~]#ansible websrvs -m yum -a 'name=https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/8/x86_64/zabbi x-agent2-5.0.24-1.el8.x86_64.rpm state=present validate_certs=no' #启用epel源进行安装 [root@ansible ~]#ansible websrvs -m yum -a 'name=nginx state=present enablerepo=epel' #升级除kernel和foo开头以外的所有包 [root@ansible ~]#ansible websrvs -m yum -a 'name=* state=lastest exclude=kernel*,foo*' #删除 [root@ansible ~]#ansible websrvs -m yum -a 'name=httpd state=absent' [root@ansible ~]#ansible websrvs -m yum -a 'name=sl,cowsay'
  1. service模块
sh
功能:管理远程主机的服务 #常见选项 name 服务名称 state 服务状态 =started 启动 =stopped 停止 =restarted 重启 =reloaded 重新载入 enabled 开机自启 daemon_reload 加载新的配置文件,使用于systemd模块 例: ansible all -m service -a 'name=httpd state=started enabled=yes' ansible all -m service -a 'name=httpd state=stopped' ansible all -m service -a 'name=httpd state=reloaded' ansible all -m shell -a "sed -i 's/^Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf" ansible all -m service -a 'name=httpd state=restarted' #重启动指定网卡服务 ansible all -m service -a 'name=network state=absent args=eth0'
  1. file模块
sh
功能:设置文件属性,创建文件,目录和软链接等 path #在被控端创建的路径 owner #属主 group #属组 mode #权限 state #状态 =touch #创建文件 =directory #创建目录 =link #软链接 =hard #硬链接 =absent #删除 recurse #yes表示递归授权 例: #创建文件及设置所有者和权限 ansible all -m file -a 'path=/data/f1.txt state=touch owner=zhang mode=600' #删除文件 ansible all -m file -a 'path=/data/f1.txt state=absent' #创建软链接 ansible web -m file -a 'src=/etc/fstab dest|path|name=/data/fstab-link state=link' #创建硬链接 ansible web -m file -a 'src=/etc/fstab name=/data/fstab-link state=hard' #创建目录 ansible web -m file -a 'path=/data/fstab state=directory' #递归修改目录属性,但不递归至子目录 ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql" #递归修改目录及子目录的属性 ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql recurse=yes"
  1. Lineinfile 模块
sh
功能:相当于sed,主要用于修改一行的内容 path #被控端文件的路径 regexp #正则匹配语法格式,表示被替换的内容 line #替换为的内容 state #absent表示删除 insertafter #插入到替换内容前面,如和regexp同时存在,只在没找到与regexp匹配时才使用 insertafter insertbefore #插入到替换内容后面,如和regexp同时存在,只在没找到与regexp匹配时才使用 insertafter backrefs #支持后面引用,yes和no backup #修改前先备份 create #如果文件不存在,则创建,默认不存在会出错 mode #指定权限 owner #指定用户 group #指定组 #注意 regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被 匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,那么这些行都会被删除。 例: #修改httpd默认监听端口 ansible web-node1 -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 8080'" #给主机增加一个网关,但需要增加到NAME=下面 ansible webservers -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth0 insertafter="^NAME=" line="GATEWAY=10.0.0.254"' #效果 cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 NAME=eth0 GATEWAY=10.0.0.254 #删除网关 ansible webservers -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfgeth0 regexp="^GATEWAY" state=absent' #删除#开头的行 ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
  1. replace模块
sh
功能:修改多行 该模块有点类似于sed命令,主要也是基于正则进行匹配和替换,建议使用 path #被控端文件的路径 regexp #正则匹配语法格式,表示被替换的内容 replace #替换为的内容 after #插入到替换内容前面, before #插入到替换内容后面 backup #修改前先备份 mode #指定权限 owner #指定用户 group #指定组 #修改db主机下的/etc/fstab文件,以UUID开头的行为分组,在行前加注释 ansible db -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'" #修改db主机下的/etc/fstab文件,以#UUID开头的行为分组,去掉行前注释 ansible db -m replace -a "path=/etc/fstab regexp='^#(UUID.*)' replace='\1'"

提示

还有很多模块,例如:hostname模块,sysctl模块,cron模块,user模块,group模块,reboot模块。都是看一眼就知道是做什么用的,只是选项不同而已,会查帮助就行。

四、重点来了,ansible做自动化运维工具的最强工作:ansible-playbook

如果说使用模块是一条条命令,那ansible-playbook就是把这些模块结合起来一起调用。相当于脚本,把命令写到脚本中,减少人工干预,提高效率,减少故障率。

4.1 playbook组成

  • 一个 playbook(剧本)文件是一个YAML语言编写的文本文件
  • 通常一个playbook只包括一个play
  • 一个 play的主要包括两部分: 主机和tasks. 即实现在指定一组主机上执行一个tasks定义好的任务列表。
  • 一个tasks中可以有一个或多个task任务
  • 每一个Task本质上就是调用ansible的一个module
  • 在复杂场景中,一个playbook中也可以包括多个play,实现对多组不同的主机执行不同的任务

4.2 playbook格式

虽然ansible是python编写的,但是ansible-playbook却是使用的yaml语言。这种语言恶心的地方就在不能用tab自动缩进,必须使用空格,对于初学者学习的时候很痛苦,可是ansible的帮助功能很强大啊,ansible-doc 模块名 就能看到playbook的范例。凡是有利有弊,yaml的可读性很高,比较格式要求严格。

----- playbook格式 -----
  • 剧本不会写,随时看帮助,ansible-doc 模块名

  • 在单一文件第一行,用连续三个连字号"-" 开始,还有选择性的连续三个点号( ... )用来表示文件的 结尾

  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能

  • 使用#号注释代码

  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换 行来实现的

  • 缩进不支持tab,必须使用空格进行缩进

  • 缩进的空格数不重要,只要相同层级的元素左对齐即可

  • YAML文件内容是区别大小写的,key/value的值均需大小写敏感

  • 多个key/value可同行写也可换行写,同行使用,分隔

  • key后面冒号要加一个空格 比如: key: value

  • value可是个字符串,也可是另一个列表

  • YAML文件扩展名通常为yml或yaml

例:

yml
cat hello.yml --- - hosts: rocky tasks: - name: "show issue" command: "cat /etc/issue" - shell: "echo hello" 也可使用: --- - hosts: rocky tasks: - name: "show issue" command: "cat /etc/issue" - shell: "echo hello" #执行yml文件使用ansible-playbook命令 例: ansible-playbook hello.yml ansible-playbook -C hello.yml #显示执行过程但是不执行,相当于语法检查。和shell -x 一致 ansible-playbook --syntax-check hello.yml #语法检查,不常用 -v #显示执行过程,-vv或-vvv更详细的执行过程

总结:这里讲了一些ansible的基础用法,当然ansible不止这些用法。基于ansible-playbook的role的用法可以批量部署一套LNMP架构,批量部署mysql、zabbix等服务。下次再和大家分享。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:笑一个吧~

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 本文为博主「笑一个吧~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 许可协议。转载请注明出处!