ansible 运维使用(一)

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 [-f forks] [-m module_name] [-a args]

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

你可能感兴趣的:(ansible 运维使用(一))