Ansible
临渊羡鱼不如退而结网
我在这里只介绍下怎么去使用,具体想要深入了解可以去ansible中文权威指南,很详细http://www.ansible.com.cn/docs/intro_configuration.html
[root@master .ssh]# cat /etc/issue CentOS release 6.8 (Final) 首先在新的机器上安装epel源 1.epel简介: https://fedoraproject.org/wiki/EPEL/zh-cn rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm 以上URL请按实际情况修改 2.查看是否安装成功 rpm -q epel-release 3.导入key: rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 4.修改/etc/yum.repos.d/epel.repo文件 在[epel]最后添加一条属性 priority=11 vi /etc/yum.repos.d/epel.repo 意思是yum先去官方源查,官方没有再去epel的源找 5.重建缓存 yum makecache
这里我们使用yum安装Ansible
yum install ansible
与批量管理机器配置公钥私钥实现无密码登陆,这里我使用自己的一台测试机做示范
在A机器创建公钥\私钥对
[root@master .ssh]# ssh-keygen -t rsa 敲三下回车 把A机器上的id_rsa.pub复制到B机下,在B机的authorized_keys里 cat id_rsa.pub >> .ssh/authorized_keys
ssh-copy-id -i ~/.ssh/id_rsa.pub 172.30.1.208 就可以了
测试下,连接B机器
成功,不需要输入密码 [root@master .ssh]# ssh 172.30.1.208 Last login: Tue Feb 21 10:11:39 2017 from master.1.cn [root@client ~]#
现在开始修改Ansible配置
[root@master .ssh]# cat /etc/ansible/hosts # This is the default ansible 'hosts' file. # # It should live in /etc/ansible/hosts # # - Comments begin with the '#' character # - Blank lines are ignored # - Groups of hosts are delimited by [header] elements # - You can enter hostnames or ip addresses # - A hostname/ip can be a member of multiple groups # Ex 1: Ungrouped hosts, specify before any group headers. ## green.example.com ## blue.example.com ## 192.168.100.1 ## 192.168.100.10 # Ex 2: A collection of hosts belonging to the 'webservers' group ## [webservers] ## alpha.example.org ## beta.example.org ## 192.168.1.100 ## 192.168.1.110 # If you have multiple hosts following a pattern you can specify # them like this: ## www[001:006].example.com # Ex 3: A collection of database servers in the 'dbservers' group ## [dbservers] ## ## db01.intranet.mydomain.net ## db02.intranet.mydomain.net ## 10.25.1.56 ## 10.25.1.57 # Here's another example of host ranges, this time there are no # leading 0s: ## db-[99:101]-node.example.com [test] #添加一个test ip为172.30.1.208 , 我要操作的客户端 172.30.1.208 #
示例 Ansible有一个非常有用的模块是 command,相信很多人都需要它!Command模块就是“远程执行命令”
相比Ansible的内置模块而言,Command模块无法通过返回值来判断命令是否执行成功。
但Ansible添加了creates 和 removes 的属性,以此检查命令是否成功执行或者是否应该被执行。
如果你定义了 creates 属性,当文件已存在时,它不会再执行。相反如果定义了 removes 属性,
则只有文件存在的情况下命令才会被执行
测试执行
ansible test -m command -a 'date' //command和shell模块可以在被控端执行命令
(失败了)
172.30.1.208 | FAILED | rc=0 >>
failed to resolve remote temporary directory from ansible-tmp-1487642084.32-198317429406356: `( umask 77 && mkdir -p "` echo ~/.ansible/tmp/ansible-tmp-1487642084.32-198317429406356 `" && echo ansible-tmp-1487642084.32-198317429406356="` echo ~/.ansible/tmp/ansible-tmp-1487642084.32-198317429406356 `" )` returned empty string
查找失败原因
为了提升效率,ansible使用了SSH的ControlPersist、ControlMaster特性。而该特征,应该需要在5.6或以上版本才能实现,Centos6.x上默认版本为5.3,在实际测试过程中,会经常报上面的错误
解决方案
1.提高SSH版本,在测试后期,我们换用了Centos7,当然也可以不换操作系统,只升级openssh。(openssh升级脚本:
http://www.cnblogs.com/shenjianyu/p/6397150.html
)
2.禁用该功能特性。
在配置文件修改
# vim /etc/ansible/ansible.cfg
[ssh_connection]
ssh_args = -o ControlMaster=no -o ControlPersist=no
再次测试 成功
[root@master .ssh]# ansible test -m command -a 'date' 172.30.1.208 | SUCCESS | rc=0 >> Tue Feb 21 10:04:53 CST 2017 [root@master .ssh]#ansible test -m command -a 'mkdir /ssj' 172.30.1.208 | SUCCESS | rc=0 >>
编写一个简单的playbook
下面有一个安装tree命令的脚本
#!/bin/bash
# 安装tree
yum install tree -y
将其转换为一个完整的playbook后:
--- - hosts: all tasks: - name: "安装tree" command: yum install -y tree
将以上内容放在一个名为playbook.yml的文件中,直接调用ansible-playbook命令,即可运行,运行结果和脚本运行结果一致:
# ansible-playbook ./playbook.yml
[root@master ansible]# ansible-playbook ./playbook.yml PLAY [all] ********************************************************************* TASK [setup] ******************************************************************* ok: [172.30.1.208] TASK [安装Apache] **************************************************************** changed: [172.30.1.208] [WARNING]: Consider using yum module rather than running yum PLAY RECAP ********************************************************************* 172.30.1.208 : ok=2 changed=1 unreachable=0 failed=0
再举个例子,拷贝脚本到客户端,执行脚本
[root@master ansible]# vim /home/touch.sh #!/bin/bash for i in `seq 10` do `touch /home/user$i` done
执行playbook报错(失败,貌似是说对应机器没有这个文件)
1 [root@master ansible]# ansible-playbook ./playbook.yml 2 3 PLAY [all] ********************************************************************* 4 5 TASK [setup] ******************************************************************* 6 ok: [172.30.1.208] 7 8 TASK [安装Apache] **************************************************************** 9 changed: [172.30.1.208] 10 [WARNING]: Consider using yum module rather than running yum 11 12 13 TASK [执行脚本] ******************************************************************** 14 fatal: [172.30.1.208]: FAILED! => {"changed": true, "cmd": ["sh", "/home/touch.sh"], "delta": "0:00:00.003191", "end": "2017-02-22 09:03:14.381231", "failed": true, "rc": 127, "start": "2017-02-22 09:03:14.378040", "stderr": "sh: /home/touch.sh: No such file or directory", "stdout": "", "stdout_lines": [], "warnings": []} 15 to retry, use: --limit @/etc/ansible/playbook.retry 16 17 PLAY RECAP ********************************************************************* 18 172.30.1.208 : ok=2 changed=1 unreachable=0 failed=1
1 [root@master ansible]# ansible test -m copy -a 'src=/home/touch.sh dest=/home' #-m 指令 -a路径 dest目的路径 2 172.30.1.208 | SUCCESS => { 3 "changed": true, 4 "checksum": "6678dda6e6661840b5cb135f66053a3d254bd739", 5 "dest": "/home/touch.sh", 6 "gid": 0, 7 "group": "root", 8 "md5sum": "f3603ea1b89bcafa6c43809c45a5fa11", 9 "mode": "0644", 10 "owner": "root", 11 "secontext": "unconfined_u:object_r:user_home_dir_t:s0", 12 "size": 59, 13 "src": "/root/.ansible/tmp/ansible-tmp-1487725606.17-235469749218236/source", 14 "state": "file", 15 "uid": 0 16 }
1 [root@master ansible]# ansible-playbook ./playbook.yml 成功 2 3 PLAY [all] ********************************************************************* 4 5 TASK [setup] ******************************************************************* 6 ok: [172.30.1.208] 7 8 TASK [安装Apache] **************************************************************** 9 changed: [172.30.1.208] 10 [WARNING]: Consider using yum module rather than running yum 11 12 13 TASK [执行脚本] ******************************************************************** 14 changed: [172.30.1.208] 15 16 PLAY RECAP ********************************************************************* 17 172.30.1.208 : ok=3 changed=2 unreachable=0 failed=0
在客户端查看下
[root@client home]# ls
ansi ansible rzrk sjy touch.sh user1 user10 user2 user3 user4 user5 user6 user7 user8 user9
Ansible 下各模块命令介绍
copy模块:
目的:把主控端/root目录下的a.sh文件拷贝到到指定节点上
命令:ansible 10.1.1.113 -m copy -a 'src=/root/a.sh dest=/tmp/'
file模块:
目的:更改指定节点上/tmp/t.sh的权限为755,属主和属组为root
命令:ansible all -m file -a "dest=/tmp/t.sh mode=755 owner=root group=root"
cron模块:
目的:在指定节点上定义一个计划任务,每隔3分钟到主控端更新一次时间
命令:ansible all -m cron -a 'name="custom job" minute=*/3 hour=* day=* month=* weekday=* job="/usr/sbin/ntpdate 172.16.254.139"'
group模块:
目的:在所有节点上创建一个组名为nolinux,gid为2014的组
命令:ansible all -m group -a 'gid=2014 name=nolinux'
user模块:
目的:在指定节点上创建一个用户名为nolinux,组为nolinux的用户
命令:ansible 10.1.1.113 -m user -a 'name=nolinux groups=nolinux state=present'
yum模块:
目的:在指定节点上安装 lrzsz 服务
命令:ansible all -m yum -a "state=present name=httpd"
service模块:
目的:启动指定节点上的 puppet 服务,并让其开机自启动
命令:ansible 10.1.1.113 -m service -a 'name=puppet state=restarted enabled=yes'
script模块:
目的:在指定节点上执行/root/a.sh脚本(该脚本是在ansible控制节点上的)
命令:ansible 10.1.1.113 -m script -a '/root/a.sh'
ping模块:
目的:检查指定节点机器是否还能连通
命令:ansible 10.1.1.113 -m ping
command模块:
目的:在指定节点上运行hostname命令
命令:ansible 10.1.1.113 -m command -a 'hostname'
raw模块:
目的:在10.1.1.113节点上运行hostname命令
命令:ansible 10.1.1.113 -m raw-a 'hostname|tee'
get_url模块:
目的:将http://10.1.1.116/favicon.ico文件下载到指定节点的/tmp目录下
命令:ansible 10.1.1.113 -m get_url -a 'url=http://10.1.1.116/favicon.ico dest=/tmp'
synchronize模块:
目的:将主控方/root/a目录推送到指定节点的/tmp目录下
命令:ansible 10.1.1.113 -m synchronize -a 'src=/root/a dest=/tmp/ compress=yes'