简介
Ansible 是 python 中的一套模块,系统中的一套自动化工具,只需要使用 ssh 协议连接及可用来系统管理、自动化执行命令等任务。
程序架构
安装目录如下(yum安装):
配置文件目录:/etc/ansible/
ansible的配置文件为/etc/ansible/ansible.cfg,ansible有许多参数,其中一些常见的参数有:
1: inventory = /etc/ansible/hosts #这个参数表示资源清单inventory文件的位置
2: library = /usr/share/ansible #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
3: forks = 5 #并发连接数,默认为5
4: sudo_user = root #设置默认执行命令的用户
5: remote_port = 22 #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
6: host_key_checking = False #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
7: timeout = 60 #设置SSH连接的超时时间,单位为秒
8: log_path = /var/log/ansible.log #指定一个存储ansible日志的文件(默认不记录日志)
ansible的主机清单
#主机组
[webserver]
172.16.1.31
172.16.1.41
#主机+端口+密码
[webserver]
172.16.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
172.16.1.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
#1.主机支持主机名通配以及正则表达式,例如 web[1:3].test.com 代表三台主机
#2.主机支持基于非标准的 ssh 端口,例如 hostname/ipaddress:666
#3.主机支持指定变量,可对个别主机的特殊配置,如登陆用户,密码
#4.主机组支持指定变量[group_name:vars],同时支持嵌套组[game:children]
#对整个主机组/所有webserver组都生效的变量效的变量
[webserver:vars]
ansible_ssh_pass='123456'
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/
Ansible 命令集
/usr/bin/ansible Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc Ansible 模块功能查看工具
ansible-doc 命令常用于获取模块信息及其使用帮助,一般用法如下:
## ansible-doc -l 获取全部模块的信息
## ansible-doc -s MOD_NAME 获取指定模块的使用帮助
#参数说明:
-s #显示playbook制定模块的用法
-l #列出可用的模块
#例如:查看mysql相关的
ansible-doc -l |grep mysql
mysql_db Add or remove MySQL databases from a remote...
mysql_replication Manage MySQL replication
mysql_user Adds or removes a user from a MySQL databas...
mysql_variables Manage MySQL global variables
ansible-doc -s mysql_user
#mysql_user:
append_privs: # Append the privileges defined by priv to the existing ones for this user instead of overwriting existing ones.
check_implicit_admin: # Check if mysql allows login as root/nopassword before trying supplied credentials.
config_file: # Specify a config file from which user and password are to be read.
connect_timeout: # The connection timeout when connecting to the MySQL server.
encrypted: # Indicate that the 'password' field is a `mysql_native_password` hash
host: # the 'host' part of the MySQL username
......
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块 的官网平台,基于网络的
/usr/bin/ansible-playbook Ansible 定制自动化的任务集编排工具
/usr/bin/ansible-pull Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
/usr/bin/ansible-vault Ansible 文件加密工具
/usr/bin/ansible-console Ansible基于Linux Consoble界面可与用户交互的命令执行工具
模块的应用语法格式:
ansible 主机名称/主机组名称/主机地址信息/all -m(指定应用的模块信息) 模块名称 -a(指定动作信息) "执行什么动作"
常用模块:
ping:
应用场景:
测试服务端与客户端之间的连通性,
ansible 主机名称/主机组名称/主机地址信息/all -m ping
shell(万能)
应用场景:
所有命令都可以执行,和本地执行效果一样
ansible 主机名称/主机组名称/主机地址信息/all -m shell -a "ip ad s eth0|grep 172"
批量执行脚本:
方法一:
在清单定义的主机上创建脚本,内容:打印主机名
cat > /root/echo.sh << EOF
#!/bin/bash
echo "$(hostname)"
EOF
然后使用ansible的shell模块批量执行
ansible 主机名称/主机组名称/主机地址信息/all -m shell -a "/bin/bash /root/echo.sh"
copy
方法二:
在ansible服务端建立脚本,内容为:打印主机名
cat > /root/echo.sh << EOF
#!/bin/bash
echo "$(hostname)"
EOF
然后使用ansible的shell模块批量执行(复制到目标主机,批量执行该脚本)
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m copy -a "src=/root/echo.sh dest=/root"
ansible 主机名称/主机组名称/主机地址信息/all -m shell -a "/bin/bash /root/echo.sh"
复制过程中更改文件属性及权限:
更改属主和属组信息:(需注意该用户必须已经存在)
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m copy -a "src=/root/echo.sh dest=/root owner=test group=test"
需改文件权限:
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m copy -a "src=/root/echo.sh dest=/root owner=test group=test mode=0600"
创建文件并直接写入内容
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m copy -a "content='123' dest=/etc/rsync mode=0600"
复制目录
src后面目录没有/: 将目录本身以及目录下面的内容都进行远程传输复制
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m copy -a "src=/data dest=/opt"
src后面目录有/: 只将目录下面的内容都进行远程传输复制
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m copy -a "src=/data dest=/opt"
参数说明:
src #推送数据的源文件信息
dest #推送数据的目标路径
backup=yes/no #文件不一致的情况下,在覆盖前,目标源文件进行备份,备份文件包含时间信息,有两个选项 yes|no
content #直接批量在被管理端文件中添加内容,
group #将本地文件推送到远端,指定文件属组信息
owner #将本地文件推送到远端,指定文件属主信息
mode #将本地文件推送到远端,指定文件权限信息
file
应用场景:
设置文件属性:
1:创建文件夹(类似 mkdir -p):
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m file -a "path=/root/data state=directory"
2:创建文件并更改属性
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m file -a "path=/root/test.txt state=touch mode=777 owner=root group=root"
3:创建软链接(被link文件需要提前存在,否则需要添加force=yes,但是是一个无用的链接)
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m file -a "src=/root/abc path=/root/abc_link state=link"
参数说明:
path #指定远程主机目录或文件信息
recurse #递归授权
state
directory #在远端创建目录
touch #在远端创建文件
link #link 或 hard 表示创建链接文件
absent #表示删除文件或目录
mode #设置文件或目录权限
owner #设置文件或目录属主信息
group #设置文件或目录属组信息
script
应用场景:
可直接在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行。
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all-m script -a "/root/echo.sh"
cron
应用场景:
创建定时任务:
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/bash /root/echo.sh'"
创建含注释信息的定时任务,防止重复。
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m cron -a "name='cron01' minute=* hour=* day=* month=* weekday=* job='/bin/bash /root/echo.sh'"
删除相应定时任务
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m cron -a "name='None' minute=* hour=* day=* month=* weekday=* job='/bin/bash /root/echo.sh' state=absent"
注释相应定时任务,使定时任务失效
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m cron -a "name='cron01' minute=* hour=* day=* month=* weekday=* job='/bin/bash /root/echo.sh' disabled=no"
user
应用场景:
创建用户指定uid,gid,不创建家目录也不允许登陆(组需提前建立)
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m user -a "name=test uid=888 group=z shell=/sbin/nologin createhome=no"
参数说明:
name #需要创建的用户名
uid #指定用户的 uid
group #指定用户组名称
groups #指定附加组名称
password #给用户添加密码
shell #指定用户登录 shell
createhome #是否创建家目录 createhome=yes/no
group
应用场景:
创建用户组
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m group -a "name=z gid=888 state=absent"
参数说明:
name #指定创建的组名
gid #指定组的 gid
state
absent #移除远端主机的组
present #创建远端主机的组(默认)
yum
应用场景:
远程安装:
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m yum -a "name=httpd state=installed"
参数说明:
name #指定要安装的软件包名称
state #指定使用 yum 的方法
installed, present #安装软件包
removed, absent #移除软件包
latest #安装最新软件包
service
应用场景:
服务启动:
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m service -a "name=nfs state=stopped enabled=yes"
参数说明:
name # 定义要启动服务的名称
state # 指定服务状态
started #启动服务
stopped #停止服务
restarted #重启服务
reloaded #重载服务
enabled #开机自启
mount
应用场景:
挂载:
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=present"
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted"
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=unmounted"
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=absent"
状态解释:
present # 开机挂载,仅将挂载配置写入/etc/fstab
mounted # 挂载设备,并将配置写入/etc/fstab
unmounted # 卸载设备,不会清除/etc/fstab 写入的配置
absent # 卸载设备,会清理/etc/fstab 写入的配置
unarchive
应用场景:
1:解压远程服务器的压缩包到指定目录
远程服务器创建压缩包:
tar -czvf /opt/sys.tar.gz /etc/fstab /etc/hosts
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m unarchive -a "src=/opt/sys.tar.gz dest=/opt/ remote_src=yes"
2:把本地文件解压到目标机器指定目录
本地创建:
tar -czvf /opt/sys.tar.gz /etc/fstab /etc/hosts
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m unarchive -a "src=/opt/sys.tar.gz dest=/opt/"
3:copy:
将远程主机上的某个压缩包解压缩到指定路径下。这种情况下,需要设置copy=no,远程主机上面的操作,不涉及ansible服务端
copy:默认为yes,当copy=yes,那么拷贝的文件是从ansible主机复制到远程主机上的,如果设置为copy=no,那么会在远程主机上寻找src源文件
archive
应用场景:
压缩单个文件:
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m archive -a "path=/var/log/message* dest=/tmp/log.tar.gz format=gz force=true"
setup
应用场景:
直接执行获取主机信息:
ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m setup
lineinfile:
功能:文件中行的添加,替换
path参数 :必须参数,指定要操作的文件
line参数 : 使用此参数指定文本内容
regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
作用:
lineinfile:
dest: /etc/profile
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
with_items:
- { regexp: '^JAVA_HOME=',line: 'export JAVA_HOME=/usr/local/jdk1.8.0_144' }
- { regexp: '^JRE_HOME=',line: 'export JRE_HOME=$JAVA_HOME/jre' }
- { regexp: '^CLASSPATH=',line: 'export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib' }
大意指,匹配以 ^JAVA_HOME=开头的行,如果有,则替换成line指定的内容,如果没匹配到,则在文本末尾添加line指定的内容,如果匹配到多行,则最后一行替换成line指定的内容
ansible输出信息颜色解释:
01\. 绿色信息: 查看主机信息/对主机未做改动
02\. 黄色信息: 对主机数据信息做了修改
03\. 红色信息: 命令执行出错了
04\. 粉色信息: 忠告信息
05\. 蓝色信息: 显示ansible命令执行的过程
`