ansible

什么是ansible

自动化运维工具,也称机器管理工具。

可以实现批量管理成百上千的多台主机。

是应用级别的跨主机编排工具。

ansible特性

1)无客户端agent的存在,不需要在被控制的节点上安装客户端应用。

2)通过ssh协议与被控制节点通信

3)基于模块工作的,可以通过模块实现在被控制节点上执行相应的命令操作

4)很多模块具有幂等性,即可实现多次模块操作的状态,如果没有发生改变,则不会重复执行

ansible命令格式

bash 复制代码
ansible  组名 -m  模块名  -a  '模块参数'
​
定义组名:在/etc/ansible/hosts
​
模块:默认使用command模块

查看模块

bash 复制代码
列出当前ansible的所有模块
ansible-doc -l 

查看指定模块的信息
ansibe-doc -s 模块名 

ansible 的常用模块

模块名 作用 指定参数
cimmand 在远程主机执行 Linux命令,但不支持管道符、重定向等特殊符号,是 ansible的默认模块 chdir、creates、removes
shell 在远程主机执行 Linux命令,支持管道符、重定向等特殊符号 chdir、creates、removes
cron 在远程主机设置 crontab计划任务 minute(分)、hour(时)、day(日)、month(月)、weekday(周)、jod(指定执行的内容)、name(任务的名称)、 state=present(添加状态)|absent(删除状态)
user 在远程主机设管理用户账户 name、uid、group、groups、shell、create_home、remove、state=present|absent
group 在远程主机设管理组账户 name、gid、state=present|absent
copy 将 ansible控制节点的文件/目录/内容复制到远程主机 src(指定源文件的路径)、dest(指定目标路径)、content(指定复制的内容)、mode(设置文件权限)、owner(设置文件名和组名)、group(设置文件名和组名)
file 在远程主机管理文件/目录 path(指定文件路径)、mode(指定权限)、owner(设置文件名和组名)、group(设置文件名和组名)、state=absent(删除文件)|touch(创建空文件)|directory(空目录)|link(创建软连接) src(指定软链接的源路径,path指定软链接文件理解)
hostname 在远程主机设置主机名 name
ping 检测与远程主机的连通性
yum|apt 在远程主机使用 yum|apt-get管理软件包 name、state=present|absent|latest
service|systemd 在远程主机使用systemctl管理服务状态 name、state=started(启动)|stopped(停止)|restarted(重启)|reloaded(重载)、enabled(开机启动)=yes|no|true|false
script 在远程主机执行ansible主机上的 shell脚本
mount 在远程主机执行挂载、解挂操作 src、path、fstype、state=mounted|unmounted|absent、opts
archive 在远程主机压缩文件/目录 path、dest、format、remove
unarchive 将 ansible主机上的或远程主机上的压缩包解压缩到远程主机的指定位置 copy(remote_src)、src、dest
replace 在远程主机修改通过正则表达式匹配的文件内容 path、regexp、replace、after、before、backup
setup 查询远程主机的系统信息(facts信息) filter

ansible管理多台主机

incentory主机清单管理

主机清单配置文件 /etc/ansible/hosts

格式:

bash 复制代码
[组名]
主机IP[:ssh端口]     #默认是 22 端口
主机名[:ssh端口]
主机IP[0:255]        #设置连续的主机列表范围[0-255]
主机名[a:z]    
ansible_port= 端口号    
ansible_user= 用户名   
ansible_password= 密码    #设置主机变量
​
​
[组名:vars]             #设置组变量
ansible_port=
ansible_user=
ansible_password=
​
​
[大组名:children]       #设置嵌套组
组名1
组名2
组名3

playbook剧本

bash 复制代码
vim XXX.yaml  XXX.yml
---                     #代表yaml文件开始
- name:                 #设置play的名称
  hosts:                #指定执行此play的远程主机组
  remote_user:          #指定执行此play的用户,不指定默认root
  gather_facts:         #设置是否收集facts信息 yes|no|true|false
  task:                 #指定此play的任务列表
  - name:                  #定义任务的名称
    模块名: 模块参数       #定义任务要使用的模块和参数(键值对格式)
  - name:  
    模块名: 模块参数
    ignore_errors: true    #忽略此任务的失败
  - name:  
    模块名: 模块参数
    notify: '任务名'       #定义此任务执行结果为changed状态时要触发的handler任务
  - name:
    模块名:模块参数
    when:                #定义条件表达式(== != > >= < <=),条件成立时执行此task任务,否则不执行此任务
  - name: 
    模块名:模块参数={{item}}
    with_items            #定义循环列表
  - name:
    模块名:模块参数
    tags:                 #定义任务的标签,ansible-playbook --tags="标签"可实现仅执行拥有指定标签的任务(拥有always标签的任务总是执行)
    -标签1
    -标签2
    
  handlers:
  - name: 任务名
    模块名: 模块参数

playbook选项

bash 复制代码
//运行playbook
ansible-playbook test1.yaml
//补充参数:
-k(--ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook test1.yaml --syntax-check        #检查yaml文件的语法是否正确
ansible-playbook test1.yaml --list-task           #检查tasks任务
ansible-playbook test1.yaml --list-hosts          #检查生效的主机
ansible-playbook test1.yaml --start-at-task='install httpd'     #指定从某个task开始运行

task任务的模块语法格式

横向格式:

bash 复制代码
模块名:参数1=值   参数2={{ 变量名 }} ......

纵向格式:

bash 复制代码
模块名:
     参数1:值
     参数2:"{{ 变量名 }}"
     ......

with_items 和 vars的语法格式

横向格式

bash 复制代码
值为纯量类型时:
with_items:[值1,值2,......]
​
vars:
变量名:[值1,值2,......]
​
值为对象类型(键值对字段)时:
with_items:
-{key1:值1,key2:值2}
-{key1:值3,key2:值4}
......

纵向格式

bash 复制代码
-name:
  with_items:
  -值1
  -值2
  ......
​
vars:
  变量名:
  -值1
  -值2
  ......
  
tasks:
-names:
 模块名:
 with_items:"{{变量名}}"
 
 
值为对象类型(键值对字段时):
with_items:
-key1:值1
 key2:值2
-key1:值3
 key2:值4
 ......
​
vars:
  变量名:
  -key1:值1
   key2:值2
  -key1:值3
   key2:值4
   ......
 

多台主机编译安装nginx

1.免交互

bash 复制代码
1.下载ssh的服务

yum -y install sshpass.x86_64
2.配置密钥对验证

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
sshpass -p '123' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.116.22
sshpass -p '123' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.116.23
复制代码

2.在管理端配置ansible

bash 复制代码
yum install -y epel-release         //先安装 epel 源
yum install -y ansible

在webservers组里设置源码编译安装nginx

bash 复制代码
vim /etc/ansible/hosts

确定另外两台被管理的主机环境

3.添加剧本,源码编译安装nginx

bash 复制代码
---
- name:third play for install nginx with source
  gather_facts:false
  hosts:webservers
  remote_user:root
  tasks:
  
#关闭防火墙和selinux
- name: disabled firewalld
  service: name=firewalld state=stopped enabled=no
- name: disable selinux
  command: '/sbin/setenforce 0'
  ignore_errors: yes
- name: disabled selinux forever
  replace: path=/etc/selinux/config regexp=enforcing replace=disabled after=loaded
​
#安装依赖包
  - name: mount cdrom
    mount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted
  - name: install pkgs
    yum: name=pcre-devel,zlib-devel,openssl-devel,gcc,gcc-c++,make state=latest
            
  #创建运行用户 
  - name: create nginx user 
    user: name=nginx create_home=no shell=/sbin/nologin
              
  #解压软件包并安装 
  - name: unarchive nginx package
    unarchive: copy=yes src=/etc/ansible/playbook/nginx-1.24.0.tar.gz dest=/opt/
  - name: install nginx with source
    shell: chdir=/opt/nginx-1.24.0/ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install
​
  #创建软链接并启动服务
  - name: create link file for nginx
    file: state=link src=/usr/local/nginx/sbin/nginx path=/usr/local/sbin/nginx
  - name: create nginx service file
    copy: src=/lib/systemd/system/nginx.service dest=/lib/systemd/system/nginx.service
  - name: start nginx
    service: name=nginx state=started enabled=yes
复制代码

运行playbook

bash 复制代码
ansible-playbook demo.yaml

template配置模板模块

1.先准备一个XXX.j2配置模板文件,在模板文件中使用{{变量名}} 格式引用主机变量、组变量、facts信息字段或vars字段自定义的变量的值

2.编辑playbook文件,在文件中的tasks任务中定义template模块配置(template:src=XXX.j2文件路径 dest=远程主机文件路径)

相关推荐
龙哥说跨境8 分钟前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
懒大王就是我23 分钟前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
Elaine20239136 分钟前
06 网络编程基础
java·网络
pk_xz1234562 小时前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强2 小时前
Linux之sed命令详解
linux·运维·服务器
海绵波波1072 小时前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip
九河云4 小时前
AWS账号注册费用详解:新用户是否需要付费?
服务器·云计算·aws
Lary_Rock4 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
幺零九零零5 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络
热爱跑步的恒川5 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程