ansible是一款基于python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible架构相对比较简单,仅需通过SSH连接客户机执行任务即可,不像Saltstack需要安装客户端,但是Saltstack的执行效率要比ansible高。工作中根据项目具体情况选择适合的运维工具。
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 #系统默认配置文件
默认在/etc/ansible/hosts中,也可在ansible的每个项目中单独填写 主机清单配置文件:
ymlansible_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
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 #全部显示,篇幅很长,有实例
截止到2022年,ansible已经有6000多个模块了,虽然模块众多,但是工作中常用的也就30来个,掌握常用的模块基本够用,而且使用到后期都使用ansible-playbook了,不会在一条命令一条命令去敲了。 这里挑几个常用的介绍一下。
提示
ansible提前和要控制的机器打通ssh-key验证,这样命令执行起来会很方便。不然还要每个主机输一次密码,不然自动化运维就成一句空话了。
shscript模块:在远程主机上执行ansible服务器的脚本(无需执行权限),此模块不具有幂等性
chdir=dir #执行命令前,先切换至目录dir
cmd #指定ansible主机的命令
creates=file #当file不存在时才会执行
removes=file #当file存在时才会执行
例:ansible all -m script -a /data/test.sh
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"
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"'
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'
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'
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"
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="^#"'
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-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
例:
ymlcat 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更详细的执行过程
本文作者:笑一个吧~
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 本文为博主「笑一个吧~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 许可协议。转载请注明出处!