一:ansible命令执行过程
1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
2. 加载自己对应的模块文件,如command
3. 通过ansible将模块或命令生成对应的临时py文件, 并将该文件传输至远程服务器的对应执行用户 $HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4. 给文件+x执行
5. 执行并返回结果
6. 删除临时py文件,sleep 0退出
执行状态: 绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
二:ansible常用模块:
1.command模块:command:在远程主机执行命令,默认模块,可忽略 -m 选项
但是,command模块不支持特殊符号,| > *,也不支持变量:
Shell命令是通过/bin/sh进行执行的,command命令没有shell的环境变量,因此不支持特殊符号或者变量的操作。
2.shell模块:和command模块相似,用shell执行命令
shell模块支持一些特殊符号:重定向符号,变量等的操作
调用Bash执行命令,类似于:cat /tmp/first.txt | awk -F '|' '{print $1,$2}' &> /tmp/example.txt 这些复杂命令,即使使用shell也可能会失败。解决办法:写到脚本中,copy到远程执行,再把需要的结果拉回执行命令的机器。
3.script模块:功能:在远程机器上执行本地脚本
(1)执行本地的shell脚本文件,管控机的shell脚本文件
(2)判断被控机上的文件是否存在,如果不存在,就执行,如果存在,就跳过:
情况1:被控机上 /root/ 不存在(script.sh)文件,则主控机上会在被控机上执行这个脚本
情况2:被控机上 /root/ 存在和主控机/root/一样的(script.sh)文件,则主控机不会在被控机上执行这个脚本
(3)判断被控机上的文件或目录是否存在,如果存在则不执行,如果不存在,则执行:
4.copy模块:copy:从ansible服务器主控端复制文件到远程主机
src:源文件 指定拷贝文件的本地路径(如果有,则拷贝目录内容,比拷贝目录本身)
dest:指定目录路径
mode:设置权限
backup:备份源文件
centent:代替src 指定本机文件内容,生成目标主机文件
(1)dest
(2)如果目标存在,默认覆盖。(此处举例指定先备份)
(3)指定内容,直接生成目标文件 (dest指定的必须是一个文件)
(4)复制/etc/目录下的文件,不包括/etc/目录本身:
5.fetch模块:从远程主机提取文件至主控端,和copy相反,目前不支持目录!可以先打包,再提取文件。
(1)
注意:会生成每个被管理主机不同编号的目录,不会发生文件名冲突
(2)
6.file模块:file:设置文件属性
path:要管理的文件路径(强制添加)
recurse:递归,文件夹要递归
src:创建硬链接,软链接时,指定源目标,配合"state=link"或者"state=hard"设置软链接,硬链接
state:状态
absent:缺席,删除
(1)创建空文件:
(2)删除空文件:
(3)创建文件时,指定文件属主和权限:
(4)创建目录:
(5)删除目录:
(6)创建软链接:
(7)删除软链接:
(8)递归设置目录及文件属性,必须和 state=directory 结合使用
7.unarchive模块:unarchive:解包解压缩,有两种方法:
(1)将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes
(2)将远程主机上的某个压缩包解压到指定路径下,设置copy=no
常见参数:
copy:默认为yes,当copy=yes时,拷贝的文件是从ansible主机复制到远程主机上;如果设置为 copy=no,会在远程主机上寻找src源文件
src:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上 的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
示例:(1)默认copy为yes,将本机目录文件解压到目录主机对应目录下:
(2)解压远程主机文件到指定目录下,并设置权限为777(前提是被控机上有这个压缩包)
8.archive模块:archive:打包压缩,将远程主机目录打包
path:指定路径
dest:指定目标文件
format:指定打包格式
owner:指定所属者
mode:设置权限
示例:将远程主机的目录打包归档至指定目录下,并设置权限为777:
9.hostname模块:hostname:管理主机名
ansible 192.168.137.160 -m hostname -a "name=new_name" #更改单个主机名
10.cron模块:cron模块主要用于添加,删除,更新操作系统的crontab任务计划
name:任务计划名称
cron_file:替换客户端该用户的任务计划的文件
minute:分(0-59,*,*/2)
hour:时(0-23,*,*/2)
day:日(1-31,*,*/2)
month:月(1-12,*,*/2)
weekday:周(0-6或1-7, *)
job:任何计划执行的命令
backup:是否备份之前的任务计划
user:新建任务计划的用户
state:指定任务计划present、absent
#特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),
weekly(每周),daily(每天),hourly(每小时)
示例:(1)创建任务
(2)删除任务:
(3)注释任务,不再生效
(3)删除名称为空的计划任务:
11.Yum模块:yum:管理包
enablerepo:启用某个源
name:要进行操作的软件包的名字,也可以传递一个 url 或者一个本地源的 rpm 包的路径
state定义软件包的状态:
-present:安装(installed也可以)
-absent:删除(removed)
-latest:安装最新的
示例:(1)查看程序列表:
(2)安装:
[root@Ansible_Master ~]# ansible 192.168.137.160 -m yum -a "anme=httpd state=present"
(3)删除:
[root@Ansible_Master ~]# ansible 192.168.137.160 -m yum -a "anme=httpd state=absent"
12.service模块:功能:实现远程管理服务的生命周期
关键参数:enabled #开机启动 yes|no
name #服务名称,必选项
runlevel #运行级别
state #状态:started | stopped | restarted | reloaded
示例:(1)停止服务:
ansible srv -m service -a 'name=httpd state=started enabled=yes'#启动服务,并设为开机自启
ansible srv -m service -a 'name=httpd state=reloaded' #重新加载
ansible srv -m service -a 'name=httpd state=restarted' #重启服务
ansible web -m service -a "name=httpd state=started" #启动
ansible web -m service -a "name=keepalived enabled=yes" #设置开机自启动
13.systemd模块:systemd模块用于控制主机的systemd服务。说白了,就是Linux下的systemd命令。需要远程主机支持systemd。
ansible test -m systemd -a "name=httpd state=started" #启动
ansible test -m systemd -a "name=httpd state=stopped" #停止服务
ansible test -m systemd -a "name=httpd state=restarted" #重启服务
ansible test -m systemd -a "name=httpd state=reloaded" #重新加载
14.user模块:user:管理用户
关键参数:group #属组
groups #附加组
home #设置家目录
name #用户名
remove #删除用户并删除用户的家目录
shell #用户登陆后的shell
system #系统用户
uid #用户的id
state #创建或删除
shell 制定用户的shell环境
15.group模块
关键参数:gid #组id
system #系统组
name #名称
ansible web -m group -a "name=jason10 system=yes gid=5000" # 创建系统组
ansible web -m group -a "name=jason11" # 创建普通的组
ansible web -m group -a "name=jason11 state=absent" # 删除组
示例:创建普通的组:
16.mount模块:
path:挂载到本地的目录
src:对端目录
fstype:文件系统类型 nfs | ext4 | ext3
state: present:只写入开机自动挂载的文件中,不挂载
mounted:既写入文件,又挂载
absent:卸载设备,并且清理开机自动挂载文件
unmounted:只卸载不清理文件
推荐:挂载的时候:mounted
卸载的时候:absent
#挂载192.168.5.80:/data目录到web_group组中的主机
ansible web_group -m mount -a 'path=/mnt 192.168.5.80:/data fstype=nfs state=mounted'
卸载,会直接删除/data目录,挂载的时候也不需要创建目标的/data目录
#ansible test -m mount -a "src=192.168.5.80:/data path=/data fstype=nfs opts=defaults state=absent"
17.setup模块:setup模块用于收集远程主机的一些基本信息。
filter参数:用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。
ansible websrvs -m setup
返回的信息非常多,很多情况我们并不需要全部的信息,可以通过过滤获得指定的信息。
获取主机ip
ansible websrvs -m setup -a "filter=ansible_all_ipv4_addresses"
获取对应主机的内存信息
ansible websrvs -m setup -a "filter=ansible_memory_mb"
通过通配符实现模糊匹配,比如以”mb”关键字结尾的信息
ansible ansible-demo3 -m setup -a "filter=*mb"
获取主机名
ansible web01 -m setup -a 'filter=ansible_fqdn'
示例:查看IP
18.firewalld模块:
ansible all -m firewalld -a 'port=443/tcp permanent=nostate=enabled'
#使用防火墙规则将443/tcp端口打开
ansible all -m firewalld -a 'service=http permanent=nostate=enabled'
19.get_url模块:(相当于Linux中的wget)
用于将文件或软件从http、https或ftp下载到本地节点上或被管理机节点上
ansible 192.168.42.210 -m get_url -a "dest=/opt/ owner=nebula group=nebula mode=600
url=http://archive.apache.org/dist/httpd/httpd-2.4.7.tar.gz"