运维工具之ansible

news2024/11/24 13:21:31

Ansible

1.什么是ansible?

​ ansible是基于ssh架构的自动化运维工具,由python语言实现,通过ansible可以远程批量部署等。

2.部署前提

​ 控制端需要安装ansible,被控制端要开启ssh服务,并允许远程登录,被管理主机需要安装python.

3.配置文件
3.1主配置文件ansible.cfg及匹配规则

​ 1.首先检测ANSIBLE_CONFIG变量定义的配置文件

​ 2.其次当前路径下ansible.cfg

​ 3.然后家目录下ansible.cfg

​ 4.最后/etc/ansible/ansible.cfg

3.2主机清单

​ 需要被控制主机列表: hosts文件

vim  /etc/ansible/hosts
​
[test]        # 主机群名
192.168.88.31   # 远程ip
192.168.88.32
​
​
[test1]
192.168.88.55
4.ansible-hoc 和ansible-doc

ansible-hoc : 远程命令行控制

​ ansible-hoc命令行的格式:

ansible-doc的常用参数:

ansible   + 主机    + 模块  + 参数
       --version   : 显示版本
       -m          : 指定模块
       -k          : 使用密码验证,要输入密码。默认是密钥验证,所以需要提前对被控机进行免密验证
ansible-doc: 查看帮助文档

ansible-doc  模块
eg: 
    ansible-doc  shell

5.ansible常用模块
5.1 command模块

​ 在远程主机执行命令,默认模块,可忽略-m选项 。Command模块 不支持特殊符号,| > * ,也不支持变量

[root@localhost etc]# ansible   all -m command  -a "ls"
client_32 | CHANGED | rc=0 >>
anaconda-ks.cfg
client_31 | CHANGED | rc=0 >>
anaconda-ks.cfg
mysql.password
sh
[root@localhost etc]# ansible   all   -a "ls"
client_31 | CHANGED | rc=0 >>
anaconda-ks.cfg
mysql.password
sh
client_32 | CHANGED | rc=0 >>
anaconda-ks.cfg
5.2 shell模块

​ Shell命令是通过/bin/sh进行执行的,command命令没有shell的环境变量,因此不支持特殊符号或变量的操作。

​ chdir:指定执行shell的目录

[root@localhost ~]# ansible  all -m shell -a "getenforce"
client_32 | CHANGED | rc=0 >>
Enforcing
client_31 | CHANGED | rc=0 >>
Enforcing
​
# chdir:指定执行shell的目录
[root@localhost ~]# ansible  all -m shell -a "chdir='/tmp'  ls -a "
client_32 | CHANGED | rc=0 >>
.
..
ansible_ansible.legacy.command_payload_u3phm_ux
.font-unix
.ICE-unix
.X11-unix
.XIM-unix
client_31 | CHANGED | rc=0 >>
.
..
ansible_ansible.legacy.command_payload_e7vxhgpd
.font-unix
.ICE-unix
.X11-unix
.XIM-unix
 
5.3 copy模块

​ 从ansible服务器主控端复制文件到远程主机 。

​ src: 本地源文件地址。

​ dest: 指定远程目标地址。

​ mode: 设置权限。

​ backup: 备份源文件。

​ content:代替src,填入目标地址,使用content时,dest只能是文件。

[root@localhost ~]# ansible  test_31 -m copy -a "src=/tmp/11.txt   dest=/tmp/11.txt owner=root group=root  mode=777  "
client_31 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "checksum": "70ec68aa8285ad385fbd67c6a59d4612c0d2b086",
    "dest": "/tmp/11.txt",
    "gid": 0,
    "group": "root",
    "mode": "0777",
    "owner": "root",
    "path": "/tmp/11.txt",
    "secontext": "unconfined_u:object_r:admin_home_t:s0",
    "size": 7,
    "state": "file",
    "uid": 0
}
5.4 fetch

​ 将远程文件复制到本地,不支持目录复制到本地,如果需要复制目录,可以先打包再fetch.复制会将src目录复制下来以远程主机命名存进dest下。

[root@localhost ~]# ansible  test_31 -m fetch -a "src=/tmp/11.txt   dest=/tmp/11.txt owner=root group=dc  mode=777  "
client_31 | CHANGED => {
    "changed": true,
    "checksum": "70ec68aa8285ad385fbd67c6a59d4612c0d2b086",
    "dest": "/tmp/11.txt/client_31/tmp/11.txt",
    "md5sum": "c6981c3084d896fd207df3fde1cb5cf3",
    "remote_checksum": "70ec68aa8285ad385fbd67c6a59d4612c0d2b086",
    "remote_md5sum": null
}
​
​
[root@localhost ~]# cd /tmp/11.txt/client_31
[root@localhost client_31]# ll
total 0
drwxr-xr-x 2 root root 20 Oct  8 13:45 tmp
[root@localhost client_31]# cd ./tmp/
[root@localhost tmp]# ll
total 4
-rwxr-xr-x 1 root root 7 Oct  8 13:45 11.txt
[root@localhost tmp]# ll
​
​
​
# 当源地址是目录
[root@localhost tmp]# mkdir  /fetch_test
[root@localhost tmp]# cd  /fetch_test/
[root@localhost fetch_test]# ll
total 0
​
​
# 远程打包
[root@localhost fetch_test]# ansible test_31 -m shell -a "tar -czvf /tmp/31.tgz  /tmp"
client_31 | CHANGED | rc=0 >>
/tmp/
/tmp/.X11-unix/
/tmp/.ICE-unix/
/tmp/.XIM-unix/
/tmp/.font-unix/
/tmp/11.txt
/tmp/ansible_ansible.legacy.command_payload_8ptat5lq/
/tmp/ansible_ansible.legacy.command_payload_8ptat5lq/ansible_ansible.legacy.command_payload.zip
/tmp/31.tgztar: Removing leading `/' from member names
​
# fetch到本地
[root@localhost fetch_test]# ansible test_31 -m fetch  -a "src=/tmp/31.tgz  dest=/fetch_test"
client_31 | CHANGED => {
    "changed": true,
    "checksum": "7d84c1a745f95464b8676ad510493efe2a1f64b0",
    "dest": "/fetch_test/client_31/tmp/31.tgz",
    "md5sum": "9794d76ba8056e6ce20bccb33ec7069f",
    "remote_checksum": "7d84c1a745f95464b8676ad510493efe2a1f64b0",
    "remote_md5sum": null
}
​
# 查看是否成功
[root@localhost fetch_test]# ll
total 0
drwxr-xr-x 3 root root 17 Oct  8 13:52 client_31
 
5.5 file

​ 对远程文件/目录操作,创建,删除等操作。

参数:

​ path: 文件路径/目录

​ owner: 文件/目录的属主

​ group: 文件/目录的属组

​ state:

​ touch: 创建文件

​ directory: 创建目录

​ absent: 删除

​ link: 软链接

​ mode: 设置权限

​ recurse: 递归修改,于state=directory结合使用

# 创建目录
[root@localhost ~]# ansible  test_31 -m file -a "path=/ansible  state=directory owner=1"
client_31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0755",
    "owner": "bin",
    "path": "/ansible",
    "secontext": "unconfined_u:object_r:default_t:s0",
    "size": 6,
    "state": "directory",
    "uid": 1
}
​
# 创建文件
[root@localhost ~]# ansible  test_31 -m file -a "path=/ansible/1  state=touch owner=1"
client_31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "dest": "/ansible/1",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "bin",
    "secontext": "unconfined_u:object_r:default_t:s0",
    "size": 0,
    "state": "file",
    "uid": 1
}
​
# 创建软连接
[root@localhost ~]# ansible  test_31 -m file -a "src=/ansible/1  dest=/ansible/1-link state=link"
client_31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "dest": "/ansible/1-link",
    "gid": 0,
    "group": "root",
    "mode": "0777",
    "owner": "root",
    "secontext": "unconfined_u:object_r:default_t:s0",
    "size": 10,
    "src": "/ansible/1",
    "state": "link",
    "uid": 0
}
​
​
# 删除文件
[root@localhost ~]# ansible  test_31 -m file -a "path=/ansible/1  state=absent owner=1"
client_31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "path": "/ansible/1",
    "state": "absent"
}
​

5.6 uncharive

unarchive:解包解压缩,有两种用法:

​ 1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes。

​ 2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no 。

# copy=yes,默认为yes,将本地压缩包解压到远程
[root@localhost zip]# ansible test_31 -m unarchive -a "src=/opt/zip/filebeat-6.5.4-linux-x86_64.tar.gz dest=/opt/test copy=yes"
​
​
# copy=no,将远程压缩包解压到远程
[root@localhost zip]# ansible test_31 -m unarchive -a "src=/opt/zip/kafka_2.13-2.6.0.tgz  dest=/opt/test copy=no"

5.7 archive

​ 将远程目录文件打包

​ path: "要压缩的文件或目录的路径"

dest: "归档文件存放的路径" format: "压缩格式,如 gz, bz2, xz, zip 等"

​ remove: yes/no, 压缩并删除源文件

 ansible test_31 -m archive -a "path=/opt/test/kafka_2.13-2.6.0  dest=/opt/test/kafka.tgz format=gz"
# 将远程主机文件压缩到远程,而不是本地

5.8 yum

​ 远程安装服务

​ name: 指定服务名称

​ state: 执行动作。安装installed,present。卸载remove,absent。latest更新最新版

ansible test_31 -m yum -a "name=httpd state=installed"
ansible test_31 -m yum -a "name=httpd state=latest"
ansible test_31 -m yum -a "name=httpd state=removed"

5.9 service

​ 管理远程服务状态。

​ name: 指定服务名称

​ state: 执行状态。started开启服务,stoped停止服务,reload重新加载。

​ enabled: yes 开机自启 ,no开机不自启。

ansible test_31 -m service -a "name=httpd state=stoped"
ansible test_31 -m service -a "name=httpd state=started enabled=yes"
ansible test_31 -m service -a "name=httpd state=reloaded enabled=yes"
 
6.PlayBook

​ ansible命令直接调用yml语言写好的playbook,playbook由多条play组成,每条play 都有一个任务(task)相对应的操作,然后调用模块modules,应用在主机清单上,通过 ssh远程连接,从而控制远程主机或者网络设备。

6.1 认识yaml语言

​ yaml语言的特性:

​ 1.可读性好

​ 2.脚本易于实现

​ yaml语法基础:

​ 1.在文件的第一行先要三个连续的-,表示开头,三个点表示结束(可省略)。

​ 2.用#表示注释

​ 3.缩进和python必须一样

​ 4.缩进时,tab和空格混用

​ 5.区分大小写

​ 6.文件扩展名通常为yml或者yaml

​ yaml的数据类型:

​ 字典:字典由多个key与value构成,key和value之间用 :分隔,所有k/v可以放在一行,或 者每个 k/v 分别放在不同行

# An employee record
 name: Example Developer
 job: Developer
 skill: Elite
也可以将key:value放置于{}中进行表示,用,分隔多个key:value
 # An employee record
 {name: "Example Developer”, job: "Developer”, skill: "Elite”}

​ 列表: 列表由多个元素组成,每个元素放在不同行,且元素前均使用"-”打头,或者将所有 元素用 [ ] 括起来放在同一行

# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
 [Apple,Orange,Strawberry,Mango]

​ linux的常见数据格式:

xml: 可拓展标记语言,用于数据交换和配置。

json:标记对象法,不支持注释,用于数据交换和配置。

yaml: 非标记语言,用于配置,大小写敏感,不支持tab。

6.2 PlayBook语法格式

​ 1.采用yaml格式编写

​ 2.playbook由一个或者多个play组成c

​ 3.ansible-playbook命令运行剧本

​ 4.每个play中包括hosts,tasks,variables,roles,handlers等元素

​ 5. : 之后必须有空格

---
- hosts: test_31 
  tasks:
    - name: test ping
      ping:
      
      
      
- hosts: test
  tasks:
    - name: test shell
      shell: touch  /tmp/`pwd`.txt
​
- hosts: test, test_31
  tasks:
    - name: test ping_both
      ping:
​
​
# 注意缩进和冒号之后必须有空格
6.3 playbook应用案例
  1. 编写ansible-playbook文件为系统创建用户,配置用户uid,group和密码。

    ---
    - hosts: test_31
      tasks:
        - name: add user
          user:
            name: dc
            uid: 1024
            group: 0
        - name: change password
          shell: echo "123456"  | passwd dc --stdin
    ​
    ​

  2. 安装httpd和vim

    ---
    - hosts: test_31
      tasks:
        - name: install_httpd,vim
          yum:
            name:
              - httpd
              - vim
            state: present
    ​

6.4 定义变量
1. inventory变量

在主机清单配置文件定义变量,{{ }}引用变量,当{{}}开头是要用引号引起来。在主机清单中的普通变量优先级高于公共变量

vim  /etc/ansible/hosts
​
[test_31]
192.168.88.31  node="node1"    # 普通变量
test.168.88.32  
[test:vars]
node = "hello"                  # 公共变量
​
​
vim  var1.yml
---
- hosts: test
  tasks:
    - name: add_user
      user:
        name: "{{node}}"
        state: present
2.setup模块收集的变量

ansible 的 setup facts 远程主机的所有变量都可直接调用。 Facts:是由正在通信的远程目标主机发回的信息,这些信息被保存在ansible变量 中。 setup模块可以实现系统中很多系统信息的显示,可以返回每个主机的系统信息包括: 版本、主机名、cpu、内存。

ansible  test_31 -m setup  # 收集的系统变量,可以直接在{{}}应用
ansible all -m setup -a 'filter="ansible_nodename"'     
查询主机名
ansible all -m setup -a 'filter="ansible_memtotal_mb"'  查询主机内存
大小
ansible all -m setup -a 
'filter="ansible_distribution_major_version"'  查询系统版本
ansible all -m setup -a 'filter="ansible_processor_vcpus"' 查询主机
cpu个数
​
​
​
#var.yml
---
- hosts: all
 remote_user: root
 gather_facts: yes
 tasks:
   - name: create log file
     file: name=/data/{{ ansible_nodename }}.log state=touch 
owner=wang mode=600
 #在playbook调用,不要用ansible命令调用
3.单独的保存变量的文件

可以在一个独立的playbook文件中定义变量,引用变量文件中的变量,比playbook中定义的变量优化级高

[root@192-168-10-22 ansible]# cat vars.yml 
var1: vsftpd #注意空格
var2: httpd #注意空格
​
​
[root@192-168-10-22 ansible]# cat test.yml 
---
- hosts: web
  remote_user: root
  vars_files:
    - vars.yml 
  tasks:
    - name: install package
      yum: name={{ var1 }}
    - name: create file4
      file: name=/data/{{ var2 }}.log state=touch
4.playbook定义的变量vars
vim  var1.yml
---
- hosts: test
  vars: 
    - node: charlotte
    - node1: dc
  tasks:
    - name: add_user
      user:
        name: "{{node}}"
        state: present
     - name:  add_user
       user:
         name: "{{node1}}"
         state:present
5.命令行 -e
ansible-playbook  -e "node=charlotte"  test.yml
​
vim  var1.yml
​
---
- hosts: test
  tasks:
    - name: add_user
      user:
        name: "{{node}}"
        state: present

优先级:

命令行>playbook定义的>主机清单

7.notify和handler使用
---
- hosts: test
  vars:
    name1: httpd
    name2: ansible
​
  tasks:
​
    - name: install_epel
      yum:
        name: epel-release
        state: present
    - name: install_httpd
      yum:
        name:
          - "{{name1}}"
          - "{{name2}}"
        state: installed
​
    - name: start_httpd
      service:
        name: "{{name1}}"
        state: started
        enabled: yes
    - name: change_config
      copy:
        src: /ansible/http.conf
        dest: /etc/httpd/conf.d/http.conf
      notify: restart httpd
​
​
  handlers:
    - name: restart httpd
      systemd:
        name: "{{name1}}"
        state: restarted

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2202635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript】JavaScript 与 V8

浏览器中运行 html 和 css 代码: html 和 css 执行过程: js 由 js 引擎(比如现在最为主流的 V8)执行。 高级的编程语言都是需要转成最终的机器指令来执行的;事实上我们编写的JavaScript无论你交给浏览器或者Node执行&…

AR虚拟试用,让网购不再只靠想象!

在数字化浪潮席卷全球的今天,电子商务已成为我们日常生活中不可或缺的一部分。然而,传统的网购体验往往受限于二维图片和文字描述,消费者在购买前只能依靠想象来构建商品的模样与适用性,这无疑增加了购物的不确定性和风险。幸运的…

深入理解缓存穿透、缓存击穿和缓存雪崩

在现代分布式系统中,缓存是提升系统性能和减轻数据库负载的重要组件。然而,在实际应用中,我们可能会遇到一些缓存问题,如缓存穿透、缓存击穿和缓存雪崩。本文将详细探讨这三种缓存问题的原理、影响以及解决方案。 一,…

智能配音软件哪款好?分享5个搞怪软件

想要让视频或社交媒体内容更加生动有趣?搞笑配音软件是个不错的选择。 无论是嘻哈风格的视频,还是搞怪的段子,合适的配音都能让内容增色不少。 今天,就让我们来探索六个文字配音软件,它们不仅能帮你实现搞笑配音&…

APK 获取 SHA1 值

1:将对应的包体放置在指定目录下 2:在此路径打开cmd命令窗口 3:输入以下命令 keytool -list -printcert -jarfile 1.apk(此处为你需要查看的apk名称)4:得到这个包体的相关信息 能查看到这个包体相关的所有签名和一些扩展的参数 …

JavaScript下载文件(简单模式、跨域问题、文件压缩)

文章目录 简介简单文件下载通过模拟form表单提交通过XMLHttpRequest方式 跨域(oss)下载并压缩文件完整示例文件压缩跨域设置 简介 相信各位开发朋友都遇到过下载的文件的需求,有的非常简单,基本链接的形式就可以。 有的就比较复杂,涉及跨域…

简易登录注册;测试类;postman测试;

项目是如何创建的,最简易的登陆注册功能是怎么实现的,数据库不能明文存放密码,密码经过了怎么样的处理存入数据库 前端使用nodejs18 后端项目需要等待maven加载完相关依赖,后端使用java17 1后端 1.1 创建项目所需要的数据库 内…

安宝特方案 | AR技术在轨交行业的应用优势

随着轨道交通行业不断向智能化和数字化转型,传统巡检方式的局限性日益凸显。而安宝特AR眼镜以其独特的佩戴方式和轻便设计,为轨道交通巡检领域注入了创新活力,提供了全新的解决方案。 01 多样化佩戴方法,完美适应户外环境 安宝特…

骨传导耳机哪个牌子最好?五大爆品骨传导耳机全维度拆解推荐!

随着科技的不断进步,消费者对电子产品的需求也在日益增长,特别是在音频领域,骨传导耳机作为一项革新性的技术,正逐渐成为市场的新宠。不同于传统的空气传导耳机,骨传导耳机通过振动颅骨直接将声音传递至内耳&#xff0…

vivo全新AI战略“蓝心智能”发布 原系统5亮相开发者大会

​10月10日,2024 vivo开发者大会在深圳国际会展中心举办,大会主题为“同心同行”。会上,vivo正式发布全新AI战略——“蓝心智能”,同时带来全面升级的自研蓝心大模型矩阵、原系统5(OriginOS 5)、蓝河操作系…

开发环境搭建之JAVA多个JDK版本安装

由于项目需要安装多个版本JDK、所以在此记录一下安装过程: 下载JDK1.8 11 17 等多个版本 简单粗暴一看就会、直接从官网下载exe安装包、然后配置环境变量即可 JDK1.8 JDK11 JDK17 安装完成之后如下图: 环境变量配置 右击“我的电脑”属性、找到…

计算机网络实验一:组建对等网络

实验一 组建对等网络 实验要求: 1. 组建对等网络,会在命令行使用ipconfig,两网络能够相互ping通,尝试netstat 命令 2. 建立局域网共享文件夹 3. 安装packet tracer,模拟组建对等网并测试对等网 1、组建对等网络 连…

RandLA-Net PB 模型 测试

tensorflow ckpt 模型 转换 pb 模型, 测试模型是否正确, 后续实现 c++ 部署。 Code: https://github.com/QingyongHu/RandLA-Net 测试PB 模型 RandLANetConvert.py import tensorflow.compat.v1 as tf tf.disable_v2_behavior

第十三章 Redis短信登录实战(基于Redis)

目录 一、概述 1.1. Session复制 1.2. 使用Redis 二、基于Redis实现共享Session登录 2.1. 实现思路 2.2. 功能实现的主要代码 2.2.1. 用户业务接口 2.2.2. 用户业务接口实现类 2.2.3. 用户控制层 2.2.4. 登录拦截器 2.2.5. 拦截器配置类 2.3. 优化登录拦截器 完…

JVM系列(一) -浅谈虚拟机的成长史

一、摘要 众所周知,Java 经过多年的发展,已经从一门单纯的计算机编程语言,发展成了一套成熟的软件解决方案。从互联网到企业平台,Java 是目前使用最广泛的编程语言。 以下这段内容是来自 Java 的官方介绍! 从笔记本电…

程序设计基础I-实验7 函数(函数题)

6-1 sdut-C语言实验-计算组合数 计算组合数。C(n,m),表示从n个数中选择m个的组合数。 计算公式如下: 若:m0,C(n,m)1 否则, 若 n1,C(n,m)1 否则,若mn,C(n,m)1 否则 C(n,m) C(n-1,m-1) C(n-1,m…

linux下新增加一块sata硬盘并使用

1)确认新硬盘能被正确识别到 2)对新硬盘进行分区 说明:fdisk指令中输入“m”,可以看到详细的指令含义。 3)确认新创建的分区 5)格式化新创建的分区 6)挂载新分区并使用

网优学习干货:王者荣耀游戏用户体验洞察及质差识别(2)

王者荣耀卡顿特点 影响时延的因素 手游定界定位解决方案 基于“9段法”进行卡顿问题分解 通过数据关联->体验定标->优化提升,改善手游卡顿 无线侧通过“面”和“点”优化改善空口时延 参数及互操作策略优化提升业务感知 传输优化准确定位管道问题——无TWAM…

kafka快速入门系统学习示例

1.主要名词 Broker:消息中间件处理节点,⼀个Kafka节点就是⼀个broker,⼀个或者多个 Broker可以组成⼀个Kafka集群。 partition:通过partition将⼀个topic中的消息分区来存储。这样的好处有多个:分区存储&#xff0…

ArgoWorkflow教程(六)---无缝实现步骤间参数传递

之前我们分析了,Workflow、WorkflowTemplate 、template 3 者之间如何传递参数。 本文主要分析同一个 Workflow 中的不同 step 之间实现参数传递,比如将上一个步骤的输出作为下一个步骤的结果进行使用(而非以文件方式传递)。 1. …