ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置,批量程序部署,批量运行命令等功能。
ansible是基于模块工作的,本事没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
1、连接插件connection plugins:负责和被监控端进行通信
2、host inventory:指定操作的主机,是一个配置文件里卖弄定义监控的主机
3、各种核心模块、command模块、自定义模块
4、借助于插件完成记录日志邮件等功能
5、playbook:可让slave节点一次执行多个任务
ansible的特性:
1、模块化:调用特定的模块,完成特定任务
2、基于python语言实现,有Paramiko,PyYAML和jinja2三个关键模块
3、部署简单
4、支持自定义模块
5、支持playbook
准备环境
主机名 | IP |
localhost(ansiblemaster) | 10.10.86.56 |
node1(ansibleslave) | 10.10.73.148 |
bogon(ansibleslave) | 10.10.73.149 |
一、ansible的安装
[[email protected] ~]# yum install ansible ##配置文件:/etc/ansible/ansible.cfg ##主机清单:/etc/ansible/hosts ##主程序:ansible、ansible-doc、ansible-playbook
二、ansible免秘钥ssh登陆
[email protected] ~]# ssh-keygen -t rsa -P ‘‘ [[email protected] ~]# ssh-copy-id -i [email protected] /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system. [[email protected] ~]# ssh-copy-id -i [email protected] /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system. ##将生产的秘钥推送给slave节点,第一次交互需要(yes/no)
三、主机组自定义
[[email protected] ~]# vim /etc/ansible/hosts [ansible_agent] 10.10.73.148 ##port 10.10.73.149 ##port ##如果slave的ssh端口不是默认的22,则可在主机后面相应的端口
四、简单测试
获取ansible的常用模块列表
[[email protected] ~]# ansible-doc -l
获取某个模块的用法
[[email protected] ~]# ansible-doc -s COMMAND ##COMMAND:yum、cron、shell、setup、copy......
1、ping
[[email protected] ~]# ansible ansible_agent -m ping ##用来测试远程主机的运行状态 10.10.73.149 | SUCCESS => { "changed": false, "ping": "pong" } 10.10.73.148 | SUCCESS => { "changed": false, "ping": "pong" }
2、setup模块
[[email protected] ~]# ansible ansible_agent -m "setup" ##获取远程主机的详情信息
3、command模块
[[email protected] ~]# ansible ansible_agent -m shell -a "ls /tmp" 10.10.73.149 | SUCCESS | rc=0 >> ansible_Z1xG26 wtc 10.10.73.148 | SUCCESS | rc=0 >> ansible_6SQ3_D report.sh wtc.txt
4、shell模块
[[email protected] ~]# ansible ansible_agent -m shell -a "echo wxpp | passwd --stdin wtc" 10.10.73.148 | SUCCESS | rc=0 >> Changing password for user wtc. passwd: all authentication tokens updated successfully. 10.10.73.149 | SUCCESS | rc=0 >> 更改用户 wtc 的密码 。 passwd: 所有的身份验证令牌已经成功更新。 ###ansible是要支持管道命令,必须要使用shell模块;同时想要支持shell特性,必须要使用shell模块
5、copy模块
(1)src=\‘#\‘" /p>
(2)content= dest=
(3)owner:指明属主
(4)group:指明数组
(5)mode:指明权限
[[email protected] tmp]# ansible ansible_agent -m copy -a "src=/tmp/wxpp.txt dest=/tmp mode=665" ##复制本地的"wxpp.txt"文件至远程主机上 10.10.73.148 | SUCCESS => { "changed": true, "checksum": "7641dc777dc18a1c2dfa3429aa8009c12c566913", "dest": "/tmp/wxpp.txt", "gid": 0, "group": "root", "mode": "0665", "owner": "root", "path": "/tmp/wxpp.txt", "size": 36, "state": "file", "uid": 0 } 10.10.73.149 | SUCCESS => { "changed": true, "checksum": "7641dc777dc18a1c2dfa3429aa8009c12c566913", "dest": "/tmp/wxpp.txt", "gid": 0, "group": "root", "mode": "0665", "owner": "root", "path": "/tmp/wxpp.txt", "size": 36, "state": "file", "uid": 0 } [[email protected] tmp]# ansible ansible_agent -m shell -a "cat /tmp/wxpp.txt" ##追加指定的文本至远程主机中 10.10.73.149 | SUCCESS | rc=0 >> wtc sent a bouquet of roses to wxpp 10.10.73.148 | SUCCESS | rc=0 >> wtc sent a bouquet of roses to wxpp [[email protected] tmp]# ansible ansible_agent -m copy -a "content=‘\nHello World‘ dest=/tmp/wxpp.txt" 10.10.73.149 | SUCCESS => { "changed": true, } 10.10.73.148 | SUCCESS => { "changed": true, } [[email protected] tmp]# ansible ansible_agent -m shell -a "cat /tmp/wxpp.txt" 10.10.73.149 | SUCCESS | rc=0 >> Hello World 10.10.73.148 | SUCCESS | rc=0 >> Hello World ##content是覆盖文件源内容,使用时注意
6、cron模块
(1)month=
(2)day=
(3)hour=
(4)weekday=
(5)minute=
(6)job= ##指明运行的命令是什么
(7)name= ##指明定时任务描述
(8)state ##指定状态,prsent表示添加定时任务,也是默认值。absent表示删除定时任务
(9)user ##指明以那个用户的身份执行
[[email protected] ~]# ansible ansible_agent -m shell -a "ls /var/spool/cron/" 10.10.73.149 | SUCCESS | rc=0 >> root 10.10.73.148 | SUCCESS | rc=0 >> root [[email protected] ~]# ansible ansible_agent -m cron -a "minute=‘*/1‘ job=‘/usr/sbin/ntpdate 10.10.86.56 &> /dev/null‘ user=wtc name=‘Wtc Job‘" 10.10.73.149 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "Wtc Job" ] } 10.10.73.148 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "Wtc Job" ] } [[email protected] ~]# ansible ansible_agent -m shell -a "cat /var/spool/cron/wtc" 10.10.73.149 | SUCCESS | rc=0 >> #Ansible: Wtc Job */1 * * * * /usr/sbin/ntpdate 10.10.86.56 &> /dev/null 10.10.73.148 | SUCCESS | rc=0 >> #Ansible: Wtc Job */1 * * * * /usr/sbin/ntpdate 10.10.86.56 &> /dev/null
7、file模块:
(1)创建链接文件:src=、path=、state=
(2)修改文件属性:path=、owner=、mode=、group=
(3)创建目录:path=、state=
(4)state
directory:如果目录不存在,则会创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建。如果文件存在,则修改mtime
absent:删除目录、文件、取消链接
[[email protected] ~]# ansible ansible_agent -m file -a "src=/etc/fstab path=/tmp/fstab.link state=link" 10.10.73.148 | SUCCESS => { "changed": true, "dest": "/tmp/fstab.link", "gid": 0, "group": "root", "mode": "0777", "owner": "root", "size": 10, "src": "/etc/fstab", "state": "link", "uid": 0 } 10.10.73.149 | SUCCESS => { "changed": true, "dest": "/tmp/fstab.link", "gid": 0, "group": "root", "mode": "0777", "owner": "root", "size": 10, "src": "/etc/fstab", "state": "link", "uid": 0 } [[email protected] ~]# ansible ansible_agent -m shell -a "ls /tmp" 10.10.73.149 | SUCCESS | rc=0 >> ansible_TdmFaK fstab.link wtc wxpp.txt 10.10.73.148 | SUCCESS | rc=0 >> ansible_1oUVuk fstab.link report.sh wtc.txt wxpp.txt [[email protected] ~]# ansible ansible_agent -m file -a "path=/tmp/fstab.link state=absent" 10.10.73.149 | SUCCESS => { "changed": true, "path": "/tmp/fstab.link", "state": "absent" } 10.10.73.148 | SUCCESS => { "changed": true, "path": "/tmp/fstab.link", "state": "absent" } [[email protected] ~]# ansible ansible_agent -m shell -a "ls /tmp" 10.10.73.148 | SUCCESS | rc=0 >> ansible_jTgQOI report.sh wtc.txt wxpp.txt 10.10.73.149 | SUCCESS | rc=0 >> ansible_CuFRGA wtc wxpp.txt
8、更多模块(ansible-doc -l)
fetch模块:拉取远程主机的文件到本地(拉取的只能是文件,但是拉取到本地之后是目录,以"hosts"文件中名字命名
hostname模块:管理主机名
yum模块:给远程主机安装应用、卸载程序
service模块:管理远程主机上的服务
user模块:管理用户的账号、密码
group模块:管理系统用户组
总结:
1、ansible是基于ssh无密钥登陆的,只限于当前用户。如果是"wtc"用户创建ansible秘钥并推送至远程主机,则使用"root"用户推送命令则需使用密码
2、对于"shell"模块,个人认为它可以实现多数模块的功能,只要能用命令表达式表达出来即可,例如:
ansible ansible_agent -m shell -a "yum install httpd" ansible ansible_agent -m shell -a "service httpd start" ansible ansible_agent -m shell -a "echo ‘wtc sent a bouquet of roses to wxpp‘ &>> /tmp/wxpp.txt" ansible ansible_agent -m shell -a "ln -sv /etc/fstab /tmp/fstab.link"