自动化运维之Ansible详解

1.Ansible安装以及配置认证

ansible也是有Python开发的。

ansible特点:

不需要安装客户端,通过sshd去通信

基于模块工作,模块可以由任何语言开发

不仅支持命令行使用模块,也支持编写yaml格式的playbook

支持sudo

又提供UI(浏览器图形化) 10台主机以内免费

开源UI

文档

ansible安装:

两台机器:

服务端:192.168.147.137

客户端:192.168.147.138

在两台机器的/etc/hosts文件里加入:

192.168.147.137 server

192.168.147.138 client

只需要在服务端上安装ansible即可

服务端:

yum install -y epel-release

yum install -y ansible

ansible配置密钥:

服务端:

生成秘钥对(默认放在/root/.ssh/目录下,也可以自定义):

ssh-keygen -t rsa

直接回车即可,不用设置秘钥密码

把公钥(id_rsa.pub)内容放到客户端(192.168.147.138)的/root/.ssh/authorized_keys里面:scp /root/.ssh/id_rsa.pub 192.168.147.138:/root/.ssh/authorized_keys

也在服务端上的/root/.ssh/authorized_keys里面复制一份公钥,后面要用本机做一个客户端,即127.0.0.1:scp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys

客户端:

更改文件权限:

chmod 600 /root/.ssh/authorized_keys

关闭selinux:

setenforce0

测试服务端连接客户端:

ssh client

如果ssh命令不存在,安装一下:

yum insall -y openssh-clients

2.ansible远程执行命令

服务端:

定义一个主机组:

vim /etc/ansible/hosts

添加一个主机组:

[testhost]

127.0.0.1

192.168.147.138

说明:testhost为主机组名字,自定义的。下面两个IP为组内的机器IP,也可以写主机名,前提是能解析为IP。

对这组主机执行w命令:

ansible testhost -m command -a 'w'

这样就可以批量执行命令了。这里的testhost为主机组名,-m后边是模块名字,-a后面是命令。当然我们也可以直接写一个IP,针对某一台机器来执行命令。

ansible 127.0.0.1 -m command -a 'hostname'

错误:“msg”:"Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"

解决:yum install -y libselinux-python

还有一个模块就是shell同样也可以实现,支持管道:

ansible testhost -m shell -a 'cat /etc/passwd | grep root'

shell功能比command功能多。

3.ansible拷贝目录或者文件

ansible testhost -m copy -a "src=/etc/ansible dest=/tmp/ansibletest owner=root group=root mode=0755"

注意:源目录会放到目标目录下面去,如果目标指定的目录不存在,它会自动创建。如果拷贝的是文件,dest指定的名字和源如果不同,并且它不是已经存在的目录,相当于拷贝过去后又重命名。但相反,如果dest是目标机器上已经存在的目录,则会直接把文件拷贝到该目录下面,例如:

ansible testhost -m copy -a "src=https://www.linuxidc.com/etc/passwd dest=/tmp/123"

这里的/tmp/123和源机器上的/etc/passwd是一致的,但如果目标机器上已经有/tmp/123目录,则会在/tmp/123/目录下建立passwd文件。

4.ansible远程执行脚本

首先创建一个shell脚本:

vim /tmp/test.sh

#!/bin/bash

echo `date` > /tmp/ansible_test.txt

然后把该脚本分发到各个机器上

ansible testhost -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh mode=0755"

最后是批量执行该shell脚本

ansible testhost -m shell -a "/tmp/test.sh"

shell模块,还支持远程执行命令并且带管道:

ansible testhost -m shell -a "cat /etc/passwd | wc -l"

5.ansible实现任务计划

服务端:

创建一个任务计划:

ansible testhost -m cron -a "name='test cron' job='/bin/touch /tmp/1212.txt' weekday=6"

如果删除该cron只需要加一个字段state=absent

ansible testhost -m cron -a "name='test cron' state=absent"

其他的时间表示:

分:minute

时:hour

日:day

月:month

周:weekday

客户端:

查看任务计划:

crontab -l

6.ansible安装rpm包和管理服务

安装httpd:

ansible testhost -m yum -a "name=httpd"

在name后面还可以加上state=installed,默认不加也可以安装

开启httpd服务,并设为开机启动:

ansible testhost -m service -a "name=httpd state=started enabled=yes"

这里的name是CentOS系统里的服务名,可以通过chkconfig --list查看。

ansible文档的使用:

ansible-doc -l 查看所有的模块

ansible-doc cron 查看指定的模块

 

7.ansible playbook介绍

类似于shell脚本,相当于把命令写入到文件里,例如:

vim /etc/ansible/test.yml

---

- hosts: testhost

 remote_user: root

 tasks:

   - name: test_playbook

     shell: touch /tmp/test.txt

说明:hosts参数制定了对哪些主机进行操作;

user参数制定了使用什么用户登录远程主机操作;

tasks制定了一个任务,其下面的name参数同样是对任务的描述,在执行过程中会打印出来。

执行:ansible-playbook /etc/ansible/test.yml

再来一个创建用户的例子:

vim /etc/ansible/create_user.yml

---

- name: create_user

 hosts: testhost

 user: root

 gather_facts: false

 vars:

   - user: "test"

 tasks:

   - name: create user

     user:

执行:ansible-playbook /etc/ansible/create_user.yml

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ce60ef5658922091167275395d1b1484.html