服务器版本信息:html
Centos6.9python
[root@db02 ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
ansible是一个基于Python开发的自动化运维工具!linux
其功能实现基于SSH远程链接服务!web
ansible能够实现批量系统配置、批量软件部署、批量文件拷贝、批量运行命令等功能shell
ansible官方资料vim
官网:http://www.ansible.com/homebash
官网文档:http://docs.ansible.com/ansible/index.html服务器
命令参数app |
参数说明运维 |
-m MODULE_NAME |
--module-name=MODULE_NAME module name to execute (default=command) 相应名称的模块被执行(默认模块为 command ); -m后边是模块的名字 |
-a MODULE_ARGS |
--args=MODULE_ARGS module arguments 模块参数信息; -a后面是要执行的命令;也能够写一个 ip ,针对一台机器来执行命令 |
-C,--check |
don’t make any changes; instead, try to predict some of the changes that may occur 不作任何改变;反而,只是尝试预言一些可能出现的改变 |
--syntax-check |
perform a syntax check on the playbook, but do not execute it 执行语法检查在剧本上,可是并不执行剧本 |
第一步、首先部署ssh+key免密码登录方式
ssh+key部署:
http://www.cnblogs.com/2lianzhang/p/8058661.html
第二步、被管理端安装libselinux
yum install libselinux-python -y
第三步、服务端安装ansible,配置文件编写
yum install ansible -y
/etc/ansible/hosts --- 定义anisble软件能够管理的主机信息
/usr/bin/ansible --- ansible执行命令
/usr/bin/ansible-playboot --- ansible执行剧本命令
/etc/ansible/hosts 配置文件编写举例
[name] 172.16.1.21 172.16.1.11 172.16.1.1
在/etc/ansible/host文件最后添加[]下面接想要管理的主机ip,[]中起任意名字
测试控制这三台主机
命令语法:
ansible name -m shell -a "hostname" ansible ---- 命令 name ---- 主机模块名称 -m ---- 指定模块的参数 shell --- 模块名称(不一样模块不一样名称) -a --- 指定利用模块执行的动做参数 "hostname" ---- 在被控主机上批量执行的操做
执行结果
[root@m01 scripts]# ansible name -m shell -a "hostname" 172.16.1.21 | SUCCESS | rc=0 >> backup 172.16.1.11 | SUCCESS | rc=0 >> nfs01 172.16.1.1 | SUCCESS | rc=0 >> web01
这样就已经能够批量控制多台主机了,主要配置中须要注意的是ssh+key的配置。
若是没有配置ssh+key密钥分发的话,能够在/etc/ansible/host文件配置管理主机的时候 在ip后面空格接:ansible_ssh_user=用户 ansible_ssh_pass=密码,这样也能够管理
ansible帮助:
ansible-doc -l ---列出全部模块信息 ansible-doc -s 模块名 ---看执行模块信息
经常使用模块 |
模块说明 |
command (重要模块) |
执行命令模块,ansible命令执行默认模块 |
shell (重要模块) |
执行shell脚本模块 |
script (重要模块) |
把脚本发到客户端,而后执行;执行脚本命令在远端服务器上 |
copy (重要模块) |
把本地文件发送到远端 |
file |
设定文件属性模块 |
service |
系统服务管理模块 |
cron |
计划任务管理模块 |
yum |
yum软件包安装管理模块 |
mount |
挂载模块 |
synchronize |
使用rsync同步文件模块 |
ansible中的远程执行命令模块
参数 |
说明 |
chdir |
在执行命令以前,经过cd命令进入到指定目录中 |
creates |
定义一个文件是否存在,若是不存在运行相应命令;若是存在跳过此步骤 |
executable |
改变shell使用command进行执行,而且执行时要使用绝对路径 |
free_form |
free_form 命令模块采用自由形式命令运行;便可以输入任意linux命令 |
removes |
定义一个文件是否存在,若是存在运行相应命令;若是不存在跳过此步骤 |
warn |
若是ansible配置文件中定义了命令警告,若是参数设置了no/false,将不会警告此行命令 |
实例:
chdir参数:在执行命令以前,经过cd命令进入到指定目录
[root@m01 scripts]# ansible oldboy -m command -a "chdir=/tmp pwd" 172.16.1.21 | SUCCESS | rc=0 >> /tmp 172.16.1.11 | SUCCESS | rc=0 >> /tmp 172.16.1.1 | SUCCESS | rc=0 >> /tmp
creates参数:定义一个文件是否存在,若是不存在运行相应命令;若是存在跳过此步骤
[root@m01 scripts]# ansible name -m command -a "pwd creates=/tmp/oldboy.txt" 172.16.1.21 | SUCCESS | rc=0 >> /root 172.16.1.11 | SUCCESS | rc=0 >> /root 172.16.1.1 | SUCCESS | rc=0 >> /root
参数 |
说明 |
chdir |
在执行命令以前,经过cd命令进入到指定目录中 |
creates |
定义一个文件是否存在,若是不存在运行相应命令;若是存在跳过此步骤 |
executable |
改变shell使用command进行执行,而且执行时要使用绝对路径 |
free_form |
free_form 命令模块采用自由形式命令运行;便可以输入任意linux命令 |
removes |
定义一个文件是否存在,若是存在运行相应命令;若是不存在跳过此步骤 |
warn |
若是ansible配置文件中定义了命令警告,若是参数设置了no/false,将不会警告此行命令 |
shell模块相似于command模块,最大区别是shell模块能够执行脚本
[root@m01 scripts]# ansible name -m shell -a "sh /server/scripts/name.sh" 172.16.1.21 | SUCCESS | rc=0 >> nfs01 172.16.1.11 | SUCCESS | rc=0 >> backup 说明:shell模块在远程执行脚本时,远程主机上必定要有相应脚本
在本地执行脚本时,将脚本中的内容传输到远程节点上运行
creates |
定义一个文件是否存在,若是不存在运行相应命令;若是存在跳过此步骤 command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database |
free_form |
命令模块采用自由形式命令运行;便可以输入任意linux命令 |
removes |
定义一个文件是否存在,若是存在运行相应命令;若是不存在跳过此步骤 |
实例:
[root@m01 scripts]# ansible name -m script -a "/tmp/name.sh" 172.16.1.21 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 172.16.1.21 closed.\r\n", "stdout": "nfs01\r\n", "stdout_lines": [ "nfs01" ] } 172.16.1.11 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 172.16.1.11 closed.\r\n", "stdout": "backup\r\n", "stdout_lines": [ "backup" ] } 说明:不须要将脚本传输到远程节点上,脚本自己不用进行受权,便可利用script模块批量执行脚本
将本地数据传输到远端,或者将远程节点上的数据进行移动
选项参数 |
选项说明 |
backup (重要参数) |
建立备份文件包含时间戳信息,以便可以还原回原文件,在某种状况原文件被覆盖错误时。 |
content |
当使用代替src参数时,将文件的内容直接设置为指定值。远端建立有指定内容文这是只是简单值,对于任何复杂或者有格式化的内容,请切换到template模块 |
dest |
文件应该被拷贝到的远程绝对路径信息。若是src是一个目录,dest也必须是目录 |
directory_mode |
当递归复制设置目录权限时,若是没有设置权限,将使用系统默认这个权限值设置在目录上只对于最近建立的,而且对于已经存在的没有效果 |
force |
默认为yes,当远程文件内容和源文件内容不一样时,将覆盖目标文件若是为no,文件将只被传输,在目标主机不存在此文件时 别名:thirsty |
group |
定义所拥有文件/目录的所属组名称,相似交由chown命令进行处理 |
mode |
定义文件或目录的权限信息;就像使用/usr/bin/chmod 设定八进制数(如0644)取消掉前导零可能会有意想不到的结果。做为1,8版本,能够指定为符号模式(如 u+rwx or u=rw,g=r,o=r) |
owner |
定义所拥有文件/目录的所属用户名称,相似交由chown命令进行处理 |
src |
本地路径文件复制到远程服务器;能够是绝对路径也能够是相对路径若是路径是一个目录,将会递归复制。在这种状况下,若是路径以“/”结束,只将在该目录的内容复制到目的地不然,若是它不以“/”结束,目录和目录下全部内容都会被复制以上这种复制方式相似于rsync |
remote_src |
若是这个值设置为True,将到远程目标主机的机器上搜索 |
validate |
在文件复制到相应目录位置以前,运行验证命令要验证的文件的路径经过%s传递,而且要在下面的例子中显示 |
实例:
[root@m01 scripts]# ansible name -m copy -a "src=/etc/hosts dest=/tmp/ mode=0777" 172.16.1.21 | SUCCESS => { "changed": true, "checksum": "da5234fc498b2c3bf8b98f6b08fe1d6d96e653c2", "dest": "/tmp/hosts", "gid": 0, "group": "root", "md5sum": "2253445a36ed3910d50887a6eb1e4b79", "mode": "0777", "owner": "root", "size": 393, "src": "/root/.ansible/tmp/ansible-tmp-1508394462.54-228657061248374/source", "state": "file", "uid": 0 } 172.16.1.11 | SUCCESS => { "changed": true, "checksum": "da5234fc498b2c3bf8b98f6b08fe1d6d96e653c2", "dest": "/tmp/hosts", "gid": 0, "group": "root", "md5sum": "2253445a36ed3910d50887a6eb1e4b79", "mode": "0777", "owner": "root", "size": 393, "src": "/root/.ansible/tmp/ansible-tmp-1508394462.62-205181338927486/source", "state": "file", "uid": 0 }
说明:
1. 若是指定的目标目录不存在,系统会自动建立,不然源目录会放到目标目录下面去
2. 若是copy的是文件,dest指定的名字和源若是不一样,而且它不是已经存在的目录,至关于copy过去后在重命名;
3. 若是dest是目标机器上已经存在的目录,则会直接把文件copy到该目录下面。
4. 设定的用户和组oldboy在全部客户端必须存在
给文件加内容:
[root@m01 scripts]# ansible name -m copy -a "content=lyq.com\n dest=/tmp/1" 172.16.1.11 | SUCCESS => { "changed": true, "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "dest": "/tmp/1", "gid": 0, "group": "root", "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", "mode": "0644", "owner": "root", "size": 7, "src": "/root/.ansible/tmp/ansible-tmp-1508465641.79-151255543511039/source", "state": "file", "uid": 0 } 172.16.1.21 | SUCCESS => { "changed": true, "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "dest": "/tmp/1", "gid": 0, "group": "root", "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", "mode": "0644", "owner": "root", "size": 7, "src": "/root/.ansible/tmp/ansible-tmp-1508465641.82-210493742853029/source", "state": "file", "uid": 0 }
设置文件属性
参数 |
说明 |
force |
强行建立符号连接的两种状况: 源文件不存在(可是往后会出现) 目标存在而且是一个文件(所以,咱们须要将“路径”文件取消,并建立“src”文件的符号连接) |
group |
定义所拥有文件/目录的所属组名称,相似交由chown命令进行处理 |
mode |
定义文件或目录的权限信息;就像使用/usr/bin/chmod 设定八进制数(如0644)取消掉前导零可能会有意想不到的结果。做为1,8版本,能够指定为符号模式(如 u+rwx or u=rw,g=r,o=r) |
owner |
定义所拥有文件/目录的所属用户名称,相似交由chown命令进行处理 |
path |
文件路径管理: 别名方式:dest,name |
recurse |
递归设置指定文件属性(这个参数值应用对于state=directory) |
src |
要连接的文件路径(只能应用 state=link),接受绝对 相对以及不存在的路径相对路径不能扩展 |
state (重要参数) |
若是指定参数为directory |
实例:
建立目录/删除目录
[root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_dir state=directory" 172.16.1.11 | SUCCESS => { "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/tmp/oldboy_dir", "size": 4096, "state": "directory", "uid": 0 } 172.16.1.21 | SUCCESS => { "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/tmp/oldboy_dir", "size": 4096, "state": "directory", "uid": 0 } [root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_dir state=absent" 172.16.1.11 | SUCCESS => { "changed": true, "path": "/tmp/oldboy_dir", "state": "absent" } 172.16.1.21 | SUCCESS => { "changed": true, "path": "/tmp/oldboy_dir", "state": "absent" }
建立文件/删除文件
[root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_file state=touch" 172.16.1.11 | SUCCESS => { "changed": true, "dest": "/tmp/oldboy_file", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "size": 0, "state": "file", "uid": 0 } 172.16.1.21 | SUCCESS => { "changed": true, "dest": "/tmp/oldboy_file", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "size": 0, "state": "file", "uid": 0 } [root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_file state=absent" 172.16.1.11 | SUCCESS => { "changed": true, "path": "/tmp/oldboy_file", "state": "absent" } 172.16.1.21 | SUCCESS => { "changed": true, "path": "/tmp/oldboy_file", "state": "absent" }
建立软链接/删除软链接
[root@m01 scripts]# ansible name -m file -a "src=/tmp/lyq_file dest=/tmp/lyq_file_link state=link" 172.16.1.11 | SUCCESS => { "changed": true, "dest": "/tmp/oldboy_file_link", "gid": 0, "group": "root", "mode": "0777", "owner": "root", "size": 16, "src": "/tmp/oldboy_file", "state": "link", "uid": 0 } 172.16.1.21 | SUCCESS => { "changed": true, "dest": "/tmp/oldboy_file_link", "gid": 0, "group": "root", "mode": "0777", "owner": "root", "size": 16, "src": "/tmp/oldboy_file", "state": "link", "uid": 0 } [root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_file_link state=absent" 172.16.1.21 | SUCCESS => { "changed": true, "path": "/tmp/oldboy_file_link", "state": "absent" } 172.16.1.11 | SUCCESS => { "changed": true, "path": "/tmp/oldboy_file_link", "state": "absent" }
将远程主机上的文件,拉取到本地
参数 |
说明 |
dest |
定义一个保存文件的目录(将远程主机拉去过来的文件保存在本地的路径信息) |
src |
指定从远程主机要拉取的文件信息 |
flat |
默认设置为no,若是设置为yes,将不显示路径信息 |
实例:
从远程主机拉取文件
[root@m01 scripts]# ansible name -m fetch -a "dest=/tmp src=/tmp/1" 172.16.1.11 | SUCCESS => { "changed": true, "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "dest": "/tmp/172.16.1.11/tmp/1", "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", "remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "remote_md5sum": null } 172.16.1.21 | SUCCESS => { "changed": true, "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "dest": "/tmp/172.16.1.21/tmp/1", "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", "remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "remote_md5sum": null }
flat 默认设置为no,若是设置为yes,将不显示路径信息
[root@m01 scripts]# ansible name -m fetch -a "dest=/tmp/ src=/tmp/1 flat=yes" 172.16.1.21 | SUCCESS => { "changed": true, "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "dest": "/tmp/1", "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", "remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "remote_md5sum": null } 172.16.1.11 | SUCCESS => { "changed": true, "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "dest": "/tmp/1", "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", "remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "remote_md5sum": null }
控制激活和配置挂载点模块
参数 |
说明 |
fstype |
指定挂载文件类型 |
path |
指定挂载点 |
opts |
设定挂载的参数选项信息 |
src |
要被挂载的目录设备信息(共享目录) |
boot |
肯定是否在启动时文件系统被挂载 |
dump |
Dump(参见 fstab5)。注意若是设置为null或状态设置为present,它将中止工做,并将在随后的运行中复制条目 |
state |
若是为mounted在fstab文件中的设备将被激活挂载和适当配置 # 若是为unmounted设备将被卸载并不会改变fstab文件信息bsent和present只处理fstab,但不影响目前的挂载 |
定时任务模块
参数 |
说明 |
minute |
分 |
hour |
时 |
day |
日 |
month |
月 |
weekday |
周 |
job |
定时任务中要执行的操做 |
name |
定义定时任务的描述信息 |
state=absent |
删除定时任务 |
disabled |
注释定时任务 |
实例:
建立定时任务
[root@m01 ~]# ansible name -m cron -a "minute=0 hour=0 job='/bin/sh /tmp/name.sh >/dev/null'" 172.16.1.21 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "None" ] } 172.16.1.11 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "None" ] }
删除定时任务
[root@m01 ~]# ansible name -m cron -a "minute=0 hour=0 job='/bin/sh /tmp/name.sh >/dev/null' state=absent"
注释定时任务
[root@m01 ~]# ansible name -m cron -a "minute=0 hour=0 job='/bin/sh /tmp/name.sh >/dev/null' state=disabled"
管理用户帐户
参数 |
说明 |
append |
若是为yes,将只添加组,而不是将它们设置为组中的列表 |
name |
要操做的用户名称 |
shell |
指定用户的使用命令路径(如:/bin/bash) |
comment |
可选设置用户帐号描述信息(又称为 GECOS) |
createhome |
除非设置为no,不然当建立帐户或不存在主目录时,将为用户建立一个主目录 |
user |
建立,移除或修改的用户名称信息 |
uid |
可选设置用户UID信息 |
实例:
[root@m01 ansible-playbook]# ansible 172.16.1.1 -m user -a "user=lyq uid=2222" 172.16.1.1 | SUCCESS => { "append": false, "changed": true, "comment": "", "group": 500, "home": "/home/lyq", "move_home": false, "name": "lyq", "shell": "/bin/bash", "state": "present", "uid": 2222 }
检查剧本:
ansible-playbook --syntax-check 剧本名 ----进行剧本配置信息语法检查
ansible-playbook -C 剧本名 ----模拟剧本执行
pyYAML语法规则
一:缩进
yaml使用一个固定的缩进风格表示数据层结构关系,Saltstack须要每一个缩进级别由两个空格组成。必定不能使用tab键(tab在vim编辑中是8个空格)
二:冒号
每一个冒号后面必定要有一个空格(以冒号结尾不须要空格,表示文件路径的模版能够不须要空格)
三:短横线
剧本开头,能够不写
这两项必需要写:
- hosts:(空格)all 处理全部服务器,找到全部服务器 tasks: 剧本要干的事
ansible-playbook --syntax-check 剧本 ----进行剧本配置信息语法检查 ansible-playbook -C 剧本 ----模拟剧本执行
rsync一键部署剧本:
- name: 后面是能够加入提示信息的
[root@m01 ansible-playbook]# vim rsync.yml - hosts: 172.16.1.21 tasks: - name: yum: name=rsync state=installed - name: copy: src=/tmp/rsyncd.conf dest=/etc/ - name: shell: userdel -r rsync && useradd rsync -M -s /sbin/nologin - name: shell: mkdir -p /backup/ && chown rsync.rsync /backup - name: copy: src=/tmp/rsync.password dest=/etc/ - name: shell: rsync --daemon creates=/var/run/rsyncd.pid - hosts: 172.16.1.11 tasks: - name: copy: content=lyq123 dest=/etc/rsync.password
写的很差的地方,请你们多多包涵