ansible 运维使用(二)之Playbook
官网 https://www.ansible.com/
官网文档 https://docs.ansible.com/
中文文档 http://www.ansible.com.cn/ < Ansible中文权威指南>
安装 pip install ansible
创建工作目录 mkdir -p /opt/ansible
复制配置文件 cp /etc/ansible/ansible.cfg /opt/ansible/
修改 vim /opt/ansible/ansible.cfg
# 修改 hosts目录
inventory = /opt/ansible/hosts
创建hosts vim /opt/ansible/hosts
[docker] # 组名
172.17.0.1 ansible_ssh_user=root ansible_ssh_pass=fenglican
172.17.0.2 ansible_ssh_user=root ansible_ssh_pass=fenglican
# 172.17.0... 可以有很多主机
# ansible_ssh_user 登陆用户
# ansible_ssh_pass 登陆密码
ansible命令格式
ansible
command模块 [执行远程命令] (默认)
ansible testservers -m command -a 'uname -n'
script模块 [在远程主机执行主控端的shell/python脚本 ] (使用相对路径)
ansible testservers -m script -a '/etc/ansible/test.sh
shell模块 [执行远程主机的shell/python脚本]
ansible testservers -m shell -a 'bash /root/test.sh'
raw模块 [类似于command模块、支持管道传递]
ansible testservers -m raw -a "ifconfig eth0 |sed -n 2p |awk '{print \$2}' |awk -F: '{print \$2}'"
将控制端的文件cp到被控端
ansible docker -m copy -a "src=./hosts dest=/root/Alic/"
常用模块介绍
copy模块:http://docs.ansible.com/ansible/copy_module.html
参数:
src:本地文件的路径,如果源是一个目录,会将目录中所有的文件都copy过去
dest:远程主机的绝对路径
owner:文件属主
group:文件属组
mode:文件权限
命令演示:
ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab owner=root mode=0644'
fetch模块:http://docs.ansible.com/ansible/fetch_module.html
下载文件,文件拉取模块主要是将远程主机中的文件拷贝到本机中,和copy模块的作用刚刚相反,
并且在保存的时候使用hostname来进行保存,当文件不存在的时候,会出现错误,
除非设置了选项fail_on_missing为yes
参数:
dest:用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile在主机pythonserver中,那么保存为/backup/pythonserver/etc/profile
fail_on_missing:当源文件不存在的时候,标识为失败
flat:允许覆盖默认行为从hostname/path到/file的,如果dest以/结尾,它将使用源文件的基础名称
src:在远程拉取的文件,并且必须是一个file,不能是目录
validate_checksum:当文件fetch之后进行md5检查
命令演示:
ansible 192.168.10.1 -S -m fetch -a "dest=tmp_file src=/tmp/ttt.txt"
192.168.10.1 | SUCCESS => {
"changed": true,
"checksum": "a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0",
"dest": "/opt/ansible/tmp_file/192.168.10.1/tmp/ttt.txt",
"md5sum": "ba1f2511fc30423bdbb183fe33f3dd0f",
"remote_checksum": "a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0",
"remote_md5sum": null
}
#ll /opt/ansible/tmp_file/192.168.10.1/tmp/ttt.txt
-rw-r--r-- 1 root root 4 Aug 8 16:26 /opt/ansible/tmp_file/192.168.10.1/tmp/ttt.txt
file模块:http://docs.ansible.com/ansible/file_module.html
功能:设置文件属性、创建符号链接、创建目录等
参数:
path:指明文件路径,可以使用name或dest来代替
owner:文件属主
group:文件属组
mode:文件权限
创建文件的符号链接:
src:指明源文件
dest:指明符号链接文件路径
命令演示:
ansible pms -m file -a 'src=/tmp/fstab dest=/srv/fstab state=link'
# ll
lrwxrwxrwx 1 root root 10 Jul 6 14:08 fstab -> /tmp/fstab
ping模块:http://docs.ansible.com/ansible/ping_module.html
功能:测试被管理主机的连通性
命令演示:
ansible all -m ping
172.16.206.134 | SUCCESS => {
"changed": false,
"ping": "pong"
}
command模块:http://docs.ansible.com/ansible/command_module.html
功能:在远程主机上执行命令
注意:command模块不支持管道符,这也是command模块和shell模块的区别。
命令演示:
ansible all -m command -a 'hostname'
172.16.206.134 | SUCCESS | rc=0 >>
localhost.localdomain
user模块:http://docs.ansible.com/ansible/user_module.html
功能:在远程主机上创建或者删除用户
参数:
name:账户名
state:
present:创建
absent:删除
group:指定用户的基本组
uid:指定uid
system:创建系统用户 值为yes 或者no
命令演示:
ansible pms -m user -a 'name=test state=present uid=306 group=root system=yes'
172.16.206.134 | SUCCESS => {
"changed": true,
"comment": "",
"createhome": true,
"group": 0,
"home": "/home/test",
"name": "test",
"shell": "/bin/bash",
"state": "present",
"system": true,
"uid": 306
}
service模块:http://docs.ansible.com/ansible/service_module.html
功能:管理远程主机上的服务状态
参数:
enabled=:是否开机自动启动,取值为yes或者no。enabled=yes,表示服务开启启动
name=:服务名
state=: 服务状态
started:启动
restarted:重启
stopped:停止
reloaded:重载
命令演示:
ansible pms -m service -a 'name=zabbix-agent state=started enabled=yes'
172.16.206.134 | SUCCESS => {
"changed": true,
"enabled": true,
"name": "zabbix-agent",
"state": "started"
}
script模块:http://docs.ansible.com/ansible/script_module.html
功能:在远程主机执行主控端的shell/python脚本
ansible pms -m script -a '/tmp/echo.sh'
172.16.206.134 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "",
"stdout": "",
"stdout_lines": []
}
shell模块:http://docs.ansible.com/ansible/shell_module.html
shell模块支持管道符,这是它与commands模块的最大区别
命令演示:
ansible pms -m shell -a 'ps -ef | grep nginx'
yum模块:http://docs.ansible.com/ansible/yum_module.html
功能:在远程主机上安装软件包
参数:
name=: 包名,如果从远程服务器本地安装某个包,则可以写该包在远程主机上绝对的路径,如name=/srv/jdk/jdk-8u66-linux-x64.rpm
state=:状态,值为present,absent,lastest
present、lasted安装
absent:卸载
lastest:安装最新版的包,相当于升级软件包
removed:删除软件包
installed:安装软件包
命令演示:
ansible pms -m yum -a 'name=/srv/jdk/jdk-8u66-linux-x64.rpm state=present'
172.16.206.134 | SUCCESS => {
"changed": false,
"msg": "",
"rc": 0,
"results": []
}
synchronize模块:http://docs.ansible.com/ansible/synchronize_module.html
注意:ansible主机和远程主机上都需要安装rsync
功能:将ansible主机上的源目录下的文件同步到远程主机上
参数:
src:ansible主机上的源路径
dest:远程主机上的目标路径
delete:delete=yes时,删除目标路径下,源路径中不存在的目录或者文件
compress:是否开启压缩功能,默认为开启
mode:同步模式,默认为push,设置mode=pull,改成pull模式
archive:默认开启了这个参数,该参数默认开启了recursive, links, perms, times, owner,group和-D参数。如果你将该参数设置为no,那么你将停止很多参数,比如会导致如下目的递归失败,导致无法拉取
rsync_opts:增加rsync的额外选项,例如
rsync_opts="--exclude=fstab" 表示同步时文件时,排除fstab文件,即不同步fstab文件。如果有delete=yes选项,而目标路径下有一个源路径下不存在的文件,如文件名为fstab,那么
rsync_opts="--exclude=fstab"表示不删除目标路径下的fstab文件
命令演示:
ansible pms -m synchronize -a 'src=/tmp/test/ dest=/tmp/aaa/ delete=yes rsync_opts="--exclude=fstab"'
#上面的命令表示将ansible主机上/tmp/test/目录下的所有文件(除了fstab)同步到远程主机的/tmp/aaa/目录下。并删除/tmp/aaa/目录下,在/tmp/test/上不存在的文件或者目录
unarchive模块:http://docs.ansible.com/ansible/unarchive_module.html
功能:解压缩,这个模块有两种用法:
1、将ansible主机上的压缩包在本地解压缩后传到远程主机上,这种情况下,copy=yes
2、将远程主机上的某个压缩包解压缩到指定路径下。这种情况下,需要设置copy=no
参数:
copy:默认为yes,当copy=yes,那么拷贝的文件是从ansible主机复制到远程主机上的,如果设置为copy=no,那么会在远程主机上寻找src源文件
src:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
命令演示:
ansible pms -m unarchive -a 'src=/srv/tomcat8/apache-tomcat-8.0.29.tar.gz dest=/usr/local copy=no mode=0755'
get_url模块:http://docs.ansible.com/ansible/get_url_module.html
功能:从http、https、ftp下载文件到远程主机
参数:
url:下载地址
dest:远程主机上的目标径路
mode:设置下载到远程主机后的文件的权限
命令演示:
ansible pms -m get_url -a 'url=ftp://ftp.cheyaoshicorp.com/pub/临时文件/derby.init.sh dest=/tmp'
172.16.206.134 | SUCCESS => {
"changed": true,
"checksum_dest": null,
"checksum_src": "770a432e9847e594e0154e31c906062585d571e0",
"dest": "/tmp/derby.init.sh",
"gid": 0,
"group": "root",
"md5sum": "4564411c7e614859965c9ab5d76df22b",
"mode": "0644",
"msg": "OK (3934 bytes)",
"owner": "root",
"size": 3934,
"src": "/tmp/tmp5nqAsJ",
"state": "file",
"uid": 0,
"url": "ftp://ftp.cheyaoshicorp.com/pub/临时文件/derby.init.sh"
cron模块
用于管理计划任务包含如下选项:
backup:对远程主机上的原任务计划内容修改之前做备份
cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
day:日(1-31,*,*/2,……)
hour:小时(0-23,*,*/2,……)
minute:分钟(0-59,*,*/2,……)
month:月(1-12,*,*/2,……)
weekday:周(0-7,*,……)
job:要执行的任务,依赖于state=present
name:该任务的描述
special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
state:确认该任务计划是创建还是删除
user:以哪个用户的身份执行
示例:
ansible test -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"'
ansible test -m cron -a 'name="yum autoupdate" weekday="2" minute=0 hour=12 user="root
ansible test -m cron -a 'backup="True" name="test" minute="0" hour="5,2" job="ls -alh > /dev/null"'
ansilbe test -m cron -a 'cron_file=ansible_yum-autoupdate state=absent'
setup模块
setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数
具体使用示例如下:
ansible 10.212.52.252 -m setup -a 'filter=ansible_*_mb' //查看主机内存信息
ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]' //查看地接口为eth0-2的网卡信息
ansible all -m setup --tree /tmp/facts //将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)
使用错误记录
ansible报错Aborting, target uses selinux but python bindings (libselinux-python) aren't installed
yum install libselinux-python -y