【Linux】Ansible集中化运维工具(详解)安装、常用模块、playbook脚本
文章目录
- 一、Ansible安装及远程控制
- 1、关闭防火墙和SELinux
- 2、安装ansible
- 3、配置SSH无密码登录
- 1、在管理机上生成一对密钥
- 2、将公钥下发到远程主机
- 3、保管密钥
- 4、主机目录
- 二、常用模块
- 1、setup模块
- 2、copy模块
- 3、file模块
- 4、shell模块
- 5、script模块
- 6、ping模块
- 7、group模块
- 8、yum模块
- 9、service模块
- 三、playbook脚本
- 1、指定节点和用户
- 2、任务列表
- 3、handlers
- 4、基本语法
- 1、变量
- 2、条件语句
- 3、循环
- 4、include
- 四、谢谢观看!
一、Ansible安装及远程控制
前提:要有两台主机(我这里是两台虚拟机)
如下:
ansible只需在管理机上安装即可。
被管理机要设置静态IP 设置方法可参考此篇博客
被管理机也被称为节点。
下文中,将被管理机centos_7_1简称为被控主机1
1、关闭防火墙和SELinux
systemctl status firewalld #查看防火墙状态
防火墙状态参数为active即为开启。
sudo systemctl stop firewalld #临时关闭防火墙
参数改为inactive即关闭状态。
关闭SELinux
查看:
getenforce
关闭:
sudo setenforce 0
2、安装ansible
1、安装Ansible软件包的EPEL源
yum install epel-release
2、安装ansible
yum -y install ansible
3、查看ansible版本
ansible --version
3、配置SSH无密码登录
需要使用到两个命令:ssh-keygen(生成一对密钥)、ssh-copy-id(把本地主机的公钥复制到目标主机上)。
1、在管理机上生成一对密钥
ssh-keygen -t rsa
遇到询问,一路回车
执行完毕后会在/root/.ssh下生成一对密钥,其中id_rsa为私钥,id_rsa.pub为公钥。
2、将公钥下发到远程主机
ssh-copy-id root@192.168.58.132 #该地址为被控主机1的ip地址
3、保管密钥
ssh-add .ssh/id_rsa
ssh 192.168.58.132 #被控机ip
此时就处于被控主机1的家目录下。
回到管理机,只需输入ssh命令
ssh 管理机ip
4、主机目录
主机目录又称主机清单,保存了ansible所管理的远程主机信息及一些连接参数,也可用来对远程主机进行分类。
主机目录的配置文件默认是/etc/ansible/hosts
查看该文件:
vi /etc/ansible/hosts
可看到以下内容:
将该文件清空,输入一下内容:
[webservers]
192.168.58.132 #被控主机1的ip地址
测试被控主机1是否能被ping通
ansible webservers -m ping
二、常用模块
查看ansible中已加载的模块
ansible-doc -l
通过ansible命令可以调用这些模块
ansible [节点] -m [模块] -a [参数]
1、setup模块
用于获取节点的详细信息。
例,使用setup模块查看webservers组的节点信息。
ansible webservers -m setup
2、copy模块
可实现从管理机向节点复制静态文件,并设置合理的文件权限。
常用参数:
dest #文件复制的目的地
src #复制的源文件
backup #是否备份原始文件
validate #复制前是否检验需要复制目的地的路径
例:
将/root/demo/demol.txt复制到所以节点的/root目录下(若没有该文件可换成其它文件):
cd /root/demo
ansible all -m copy -a 'dest=/root src=/root/demo/demol.txt
3、file模块
可用来定义文件或目录属性、权限,创建、删除文件或目录。
常用参数:
mode #文件的读/写权限
path #文件路径
src #文件链接路径
stat #默认值:file
#选项:file #创建文件
link #创建链接
sbsent#删除文件
4、shell模块
可以执行远程主机的shell脚本文件,也支持管道。
例:
检查mysql进程是否存在:
ansible all -m shell -a 'ps -ef|grep mysql'
由图可知,节点192.168.58.132下有mysql进程。
5、script模块
用于将管理机上的shell脚本发送到节点上执行。
例,
写一个脚本:
vi hello.sh
//脚本内容为:
#!/bin/bash
echo "hello ansible"
不会写shell脚本可参考这两篇博客:
Shell概念、命令、操作(重定向、管道、变量)
Shell脚本编写基本语法
将该脚本发送到webservers组的节点上执行:
ansible webservers -m script -a '/root/hello.sh'
6、ping模块
检查连通性。
ansible webservers -m ping
7、group模块
可以在节点上创建组。
常用参数
gid #用户组的GID
name #用户组的名字
state #默认值;present
#选项:present #新增
# absent #删除
例:
在webservers组的节点上创建一个组名为test、GID为2017的组:
ansible webservers -m group -a 'gid=2017 name=test'
8、yum模块
从指定服务器自动下载安装RPM包,并且可自动处理依赖性关系。
常用参数:
name #包名
state 选项:present #安装
latest #更新
absent #卸载
例:
在被控主机1上安装命令tree:
ansible 192.168.58.132 -m yum -a "name=tree state=present"
9、service模块
管理节点上的服务,可开启、关闭、重启服务等。
参数 选项 含义
enabled yes/no 是否开机自启动
name -- 服务名称
state started 启动
stopped 关闭
restarted 重启
reloaded 重新下载
例:
开启被控节点192.168.58.132端的firewalld服务:
ansible 192.168.58.132 -m service -a "name=firewalld state=started"
可在对应节点使用systemctl status firewalld命令来查看firewalld状态。
三、playbook脚本
在学习ansible模块的时候,都是使用命令在节点上执行任务,命令使用比较复杂,且每执行一次均要重复输入,为避免重复输入命令,ansible提供了playbook脚本。一个能被ansible执行的YAML文件叫做playbook。
1、指定节点和用户
每个playbook都需要指定针对那些节点进行运维,并且以哪个用户来执行任务。
指定节点:hosts
指定用户:users
-hosts: webservers #指定webservers组中的所有节点
users: root #指定用户为root
注:hosts的值可以是主机或组,也可以是关键字all,全部节点。
2、任务列表
即要执行的任务的队列,关键字为tasks。任务列表中的每个任务都通过调用ansible模块完成。按定义的先后顺序执行。
例:
tasks:
- name: running nginx #启动nginx服务
service: name=nginx state=running #调用service模块
name标签是对任务的描述,也可以不加,但一般是会使用name标签。
3、handlers
对ansible模块进行调用,用于处理一些动态事件。
handlers中的模块调用与任务列表中的任务不同,任务默认按定义顺序执行,而handlers只有被触发时才会执行。
4、基本语法
1、变量
在playbook文件中,是通过字段vars来定义变量的。
例:
- hosts: all #指定节点为所有节点
vars:
http_port: 80 #定义http_port变量,值为80
2、条件语句
由字段when声明。
例:
当操作系统为Red Hat时执行重启命令:
task:
- name: reboot Red Hat host
command: /usr/sbin/reboot
when: ansible_os_family=="Red Hat"
执行顺序:先判断when条件。如果成立,返回True,则执行上一条语句command:;
如果不成立,返回False,不会触发上一条语句
3、循环
常见的循环由字段with_items声明。
例:
在指定节点上同时安装多个软件;
task:
- name: install LAMP
yum: name={{item}} state=present
with_items:
- nginx
- mysql-server
- php
代码功能:安装nginx、mysql-server、php 3个软件。with_items会自动循环执行上面的语句:name={{item}} state=present,会用软件名替换item,循环次数为元素个数。
4、include
当多个playbook需要重复使用任务列表时,可以将任务内容抽离出来写入独立文件中,要调用时只需用include将文件包含进来。
例:有单独的任务列表文件tasks/nignx.yml,文件内容为:
---
- name: install nginx
yum: name=nginx state=present #安装nginx
此后,如果有playbook要执行该操作,只需写入以下代码:
tasks:
- include: tasks/nginx.yml #将该文件包含进来
用例演示:
通过编写一个playbook实现Apache的安装与启动。
1、创建目录:
mkdir /root/ansible
在该目录下添加apache.yml文件,此文件就是一个playbook
cd /root/ansible
touch apache.yml
编写playbook内容为:
---
- hosts: 192.168.58.132
users: root
vars:
http_port: 80
max_clients: 200
tasks:
- name: ensure apache is latest
yum: pkg=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
使用以下命令调用:
ansible-playbook /root/ansible/apache.yml
四、谢谢观看!
参考书籍:《Linux系统管理与自动化运维》黑马程序员/编著