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=远程主机文件路径)

相关推荐
A小辣椒4 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒8 小时前
TShark:基础知识
linux
AlfredZhao10 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux