使用自动化运维工具Ansible集中化管理服务器

it2023-06-01  74

ansible概述和运行机制

Ansible 概述

Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。它用Python写成,类似于saltstack和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。它使用SSH来和节点进行通信。Ansible基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言,更强的远程命令执行操作

官方网站:https://www.ansible.com/

Ansiblle特点

1、部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作; 2、默认使用SSH协议对设备进行管理; 3、主从集中化管理; 4、配置简单、功能强大、扩展性强; 5、支持API及自定义模块,可通过Python轻松扩展; 6、通过Playbooks来定制强大的配置、状态管理 7、对云计算平台、大数据都有很好的支持;

Ansible 工作机制

由上面的图可以看到 Ansible 的组成由 5 个部分组成:

Ansible :     ansible核心 Modules :    包括 Ansible 自带的核心模块及自定义模块 Plugins :      完成模块功能的补充,包括连接插件、邮件插件等 Playbooks :   剧本;定义 Ansible 多任务配置文件,由Ansible 自动执行 Inventory :    定义 Ansible 管理主机的清单  [ˈɪnvəntri] 清单

实战-安装并配置Ansible管理两个节点

安装ansible服务

ansible 服务端  centos-60 192.168.0.60 ansible节点1     centos-60 192.168.0.60 ansible节点2     centos-90 192.168.0.90

在centos-60上安装ansible

1、 设置EPEL仓库 Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库。

 yum install epel-release -y 

 2、 使用yum安装Ansible yum install ansible -y ansible --version

anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数]

ansible详细参数:  

-v,-verbose   #  详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)-i PATH, -inventory=PATH      #  指定 host 文件的路径,默认是在 /etc/ansible/hosts inventory  [ˈɪnvəntri]  库存 -f NUM,-forks=NUM     # NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。 -m NAME,-module-name=NAME    #   指定使用的 module 名称,默认使用 command模块 -a,MODULE_ARGS   #指定 module 模块的参数 -k,-ask-pass           #提示输入 ssh 的密码,而不是使用基于 ssh 的密钥认证 -sudo          # 指定使用 sudo 获得 root 权限 -K,-ask-sudo-pass             #提示输入 sudo 密码,与 -sudo 一起使用 -u USERNAME,-user=USERNAME          # 指定移动端的执行用户 -C,-check             #测试此命令执行会改变什么内容,不会真正的去执行

ansible-doc详细参数:

ansible-doc -l           #列出所有的模块列表ansible-doc -s 模块名    #查看指定模块的参数  -s,   snippet  [ˈsnɪpɪt]   片断

3、定义主机清单 基于ssh密钥来访问定义主机清单 一般来说,使用明文密码不安全,所以增加主机无密码访问。 在Ansible服务端生成密钥,并且复制公钥到节点中。 ssh-keygen   #一直往下回车 使用ssh-copy-id命令来复制Ansible公钥到节点:centos-60和centos-60 ssh-copy-id root@192.168.1.60 ssh-copy-id root@192.168.1.90 ssh 192.168.1.90 exit

vim /etc/ansible/hosts  #在文件的最后添加以下内容 删除之前在最后添加的两行主机清单: [web-servers] 192.168.0.60  ansible_ssh_port=22  ansible_ssh_user=root  ansible_ssh_pass=123456 增加: [web-servers] 192.168.0.60 192.168.0.90

在Ansible服务端运行命令 ping模块检查网络连通性 command模块执行shell命令,command:作为ansible的默认模块,可以运行远程权限范围内的所有shell命令 ansible -i /etc/ansible/hosts web-servers -m ping  -i    #  指定 host 文件的路径,默认是在 /etc/ansible/hosts  -m    # 指定使用的ping模块 ansible 'web-servers'  -m ping   #不指定,默认使用/etc/ansible/hosts文件 检查Ansible节点的运行时间(uptime) ansible -m command -a "uptime" 'web-servers'检查节点的内核版本 ansible -m command -a "uname -r" 'web-servers'给节点增加用户 ansible -m command -a "useradd mk123" 'web-servers' ansible -m command -a "grep mk123 /etc/passwd" 'web-servers'将df命令在所有节点执行后,重定向输出到本机的/tmp/command-output.txt文件中

ansible常见模块高级使用方法

command模块为ansible默认模块,不指定-m参数时,使用的就是command模块; comand模块比较简单,常见的命令都可以使用,但其命令的执行不是通过shell执行的,所以,像这些 "<", ">", "|", and "&"操作都不可以,当然,也就不支持管道; 缺点:不支持管道,没法批量执行命令;

shell模块:使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的各种命令方式,都可以使用。

运行free -m 命令 ansible -i /etc/ansible/hosts  web-servers -m shell -a "free -m" 但是我们自己定义在~/.bashrc或~/.bash_profile中的环境变量shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;

如果待执行的语句少,可以直接写在一句话中:  ansible web-servers -m shell -a "source ~/.bash_profile && df -h | grep sda3" 因为centos-90不存在sda3,所以返回空

 

使用scripts模块可以在本地写一个脚本,在远程服务器上执行:

vim  /etc/ansible/net.sh #!/bin/bash date hostname ansible web-servers -m script -a "/etc/ansible/net.sh"

copy模块:实现主控端向目标主机拷贝文件,类似scp功能 ansible -i /etc/ansible/hosts web-servers -m copy -a "src=/etc/hosts dest=/tmp/ owner=root group=root mode=0755" ansible-doc copy

file模块设置文件属性 ansible  -m file -a "path=/tmp/hosts mode=0777" ansible-doc file

stat模块获取远程文件信息 ansible web-servers -m stat -a "path=/tmp/hosts"

get_url模块实现远程主机下载指定url到本地,支持sha256sum文件校验 ansible web-servers -m get_url -a "url=http://mirrors.aliyun.com/repo/Centos-7.repo dest=/tmp/ mode=0440 force=yes"

查看force=yes的作用 ansible-doc -s get_url

如果force=yes,当下载文件时,如果所下的内容和原目录下的文件内容不一样,则替换原文件,如果一样,就不下载了。 如果为“否”,则仅在目标不存在时才下载文件。 一般来说,只有小型本地文件才应该为“是”。 在0.6之前,该模块表现为默认为“是”。

yum模块linux平台软件包管理  ansible -i /etc/ansible/hosts web-servers -m yum -a "name=httpd  state=latest"  yum模块可以提供的status状态: latest ,present,installed  #这3个代表安装;removed, absent #这2个代表卸载  

如果不知道模块名称怎么办 ansible-doc -l | grep yum 可以进行搜索,比如搜想知道有没有yum模块

ansible-doc yum

cron模块远程主机crontab配置 ansible  web-servers -m cron -a "name='list dir' minute='*/30' job='ls /tmp'" ansible-doc cron

service模块远程主机系统服务管理

想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭 ansible web-servers -m service -a "name=httpd state=restarted enabled=yes"  state=started、stopped、restarted(重启)、reloaded enabled=yes开机启动,设置为 no 表示不会开机启动

sysctl模块远程主机sysctl配置,改内核参数 ansible -i /etc/ansible/hosts web-servers -m sysctl -a "name=net.ipv4.ip_forward value=1 reload=yes" cat /proc/sys/net/ipv4/ip_forward

user模块远程主机用户管理 ansible web-servers -m user -a "name=centos state=present"

实战-使用Playbook批量部署多台LAMP环境

playbooks使用步骤 playbook是一个不同于使用ansible命令行执行方式的模式,功能更强大更灵活。 在playbooks 中定义任务: - name: task description     #任务描述信息  module_name: module_args    #需要使用的模块名字:  模块参数

ansible-playbook 执行 命令: ansible-playbook site.yml playbook是由一个或多个"play"组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。 github上提供了大量的实例供大家参考  https://github.com/ansible/ansible-examples

Playbook常用文件夹作用:  files:存放需要同步到异地服务器的源码文件及配置文件;  handlers:当服务的配置文件发生变化时需要进行的操作,比如:重启服务,重新加载配置文件,handlers ['hændləz] 处理程序 meta:角色定义,可留空;    meta  ['metə]  元 tasks:需要进行的执行的任务; templates:用于执行lamp安装的模板文件,一般为脚本;    templates  ['templɪts]  模板 vars:本次安装定义的变量

使用Playbook批量部署多台LAMP环境

首先,我们可以在ansible服务器上安装LAMP环境,然后,再将配置文件通过ansible拷贝到远程主机上

第一步:安装httpd软件 yum install httpd -y

第二部:安装MySQL yum install mariadb-server  mariadb  -y mkdir -p  /mydata/data chown -R mysql:mysql /mydata/ vim /etc/my.cnf改:2 datadir=/var/lib/mysql 为:2 datadir=/mydata/data  systemctl start mariadb

第三步:安装PHP和php-mysql模块 yum install php php-mysql y

四步:提供php的测试页 vim /var/www/html/index.php  

<?php phpinfo(); ?>

启动httpd服务,在浏览器中访问,确保数据库也能正常访问 systemctl restart httpd

http://192.168.0.60/index.phphttp://192.168.0.60/mysql1.php 这里浪费了1个小时时间,排错,就是打不开页面,服务也都正常启动,后来通过 tail /var/log/httpd/error_log发现错误,就是<?php phpinfo(); ?>这句话不应该复制粘贴,手打一遍就好了。

[Wed Oct 21 15:46:53.858304 2020] [:error] [pid 8454] [client 192.168.0.6:10153] PHP Parse error: syntax error, unexpected '\xc2\xa0' (T_STRING) in /var/www/html/index.php on line 2 [Wed Oct 21 15:46:54.192198 2020] [:error] [pid 8497] [client 192.168.0.6:10154] PHP Parse error: syntax error, unexpected '\xc2\xa0' (T_STRING) in /var/www/html/index.php on line 2 [Wed Oct 21 15:46:54.708909 2020] [:error] [pid 8450] [client 192.168.0.6:10155] PHP Parse error: syntax error, unexpected '\xc2\xa0' (T_STRING) in /var/www/html/index.php on line 2 [Wed Oct 21 15:46:55.390754 2020] [:error] [pid 8451] [client 192.168.0.6:10157] PHP Parse error: syntax error, unexpected '\xc2\xa0' (T_STRING) in /var/www/html/index.php on line 2 [Wed Oct 21 15:47:03.708177 2020] [:error] [pid 8452] [client 192.168.0.6:10158] PHP Parse error: syntax error, unexpected '\xc2\xa0' (T_STRING) in /var/www/html/index.php on line 2

定义组名: vim /etc/ansible/hosts[web-servers]192.168.0.60192.168.0.90

然后,将公钥信息复制到被控制节点ansible和两个节点间通过ssh进行连接ssh-keygen ssh-copy-id root@192.168.0.60ssh-copy-id root@192.168.0.90

使用playbook创建一个LAMP构建的任务

1、创建相关文件 mkdir -pv /etc/ansible/lamp/roles/{prepare,httpd,mysql,php}/{tasks,files,templates,vars,meta,default,handlers} 我们将上面搭建成功的LAMP环境的httpd和MySQL的配置文件拷贝到对应目录下 cd /etc/ansible/ cp /etc/httpd/conf/httpd.conf /etc/ansible/lamp/roles/httpd/files/ cp /etc/my.cnf /etc/ansible/lamp/roles/mysql/files/写prepare(前期准备)角色的playbooks vim /etc/ansible/lamp/roles/prepare/tasks/main.yml

- name: delete yum config shell: rm -rf /etc/yum.repos.d/* #删除原有的yum配置文件 - name: provide yumrepo file shell: wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #下载新的yum配置文件 - name: clean the yum repo   shell: yum clean all    #清除原有的yum缓存信息 - name: clean the iptables shell: iptables -F #清除原有防火墙规则,不然后可能上不了网

 

- name: delete yum config shell: rm -rf /etc/yum.repos.d/* - name: provide yumrepo file shell: wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo - name: clean the yum repo shell: yum clean all - name: clean the iptables shell: iptables -F

2、构建httpd的任务 mv /var/www/html/index.php /etc/ansible/lamp/roles/httpd/files/ vim /etc/ansible/lamp/roles/httpd/tasks/main.yml

- name: web server install   yum: name=httpd state=present    #安装httpd服务 - name: provide test page   copy: src=index.php dest=/var/www/html    #提供测试页 - name: delete apache config shell: rm -rf /etc/httpd/conf/httpd.conf #删除原有的apache配置文件,如果不删除,下面的copy任务是不会执行的,因为当源文件httpd.conf和目标文件一样时, copy命令是不执行的。如果copy命令不执行,那么notify将不调用handler。 - name: provide configuration file   copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf    #提供httpd的配置文件 notify: restart httpd #当前面的copy复制成功后,通过notify通知名字为restart httpd的handlers运行。 - name: web server install yum: name=httpd state=present - name: provide test page copy: src=index.php dest=/var/www/html - name: delete apache config shell: rm -rf /etc/httpd/conf/httpd.conf - name: provide configuration file copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf notify: restart httpd

 

3、构建httpd的handlers vim /etc/ansible/lamp/roles/httpd/handlers/main.yml

- name: restart httpd service: name=httpd enabled=yes state=restarted

4、部署我们的MariaDB数据库 创建MySQL服务的任务,需要安装MySQL服务,改变属主信息,启动MySQL vim /etc/ansible/lamp/roles/mysql/tasks/main.yml

- name: install the mysql yum: name=mariadb-server state=present #安装mysql服务 - name: mkdir date directory shell: mkdir -p /mydata/data #创建挂载点目录 - name: provide configration file copy: src=my.cnf dest=/etc/my.cnf #提供mysql的配置文件 - name: chage the owner shell: chown -R mysql:mysql /mydata/* #更改属主和属组 - name: start mariadb service: name=mariadb enabled=yes state=started #启动mysql服务

5、构建PHP的任务 vim /etc/ansible/lamp/roles/php/tasks/main.yml

- name: install php   yum: name=php state=present    #安装php - name: install php-mysql   yum: name=php-mysql state=present    #安装php与mysql交互的插件 - name: install php yum: name=php state=present - name: install php-mysql yum: name=php-mysql state=present

 

6、定义整个的任务 任务是有执行顺序从上向下执行 vim /etc/ansible/lamp/roles/site.yml

- name: LAMP build remote_user: root hosts: web-servers roles: - prepare - mysql - php - httpd

开始部署: ansible-playbook -i /etc/ansible/hosts /etc/ansible/lamp/roles/site.yml --syntax-check 检查语法没有问题,即可执行 ansible-playbook -i /etc/ansible/hosts /etc/ansible/lamp/roles/site.yml

 

 

 

最新回复(0)