⾃动化运维利器Ansible-基础

Ansible基础

  • 一、工作原理
  • 二、快速入门
    • [2.1 测试所有资产的网络连通性](#2.1 测试所有资产的网络连通性)
    • [2.2 发布文件到被管理节点(资产)](#2.2 发布文件到被管理节点(资产))
  • 三、资产(被管理节点)
    • [3.1 静态资产](#3.1 静态资产)
      • [3.1.1 自定义资产](#3.1.1 自定义资产)
      • [3.1.2 自定义资产的使用](#3.1.2 自定义资产的使用)
      • [3.1.3 资产选择器](#3.1.3 资产选择器)
  • [四、Ansible Ad-Hoc 命令](#四、Ansible Ad-Hoc 命令)
    • [4.1 模块类型](#4.1 模块类型)
      • [4.1.1 command & shell 模块](#4.1.1 command & shell 模块)
      • [4.1.2 copy模块](#4.1.2 copy模块)
      • [4.1.3 yum_repsitory模块](#4.1.3 yum_repsitory模块)
      • [4.1.4 yum 模块](#4.1.4 yum 模块)
      • [4.1.5 user模块](#4.1.5 user模块)

按顺序食用,口味更佳

( 1 ) ⾃动化运维利器Ansible-基础

( 2 ) ⾃动化运维利器 Ansible-Playbook

( 3 ) ⾃动化运维利器 Ansible-变量

( 4 ) ⾃动化运维利器AnsiblePlaybook的任务控制

( 5 ) ⾃动化运维利器 Ansible-Jinja2

( 6 ) ⾃动化运维利器 Ansible-最佳实战

一、工作原理

Ansible 是⼀个 IT ⾃动化⼯具。它能配置系统、部署软件、编排更复杂的 IT 任务,如连续部署或零停机时间滚动更新。

Ansible ⽤ Python 编写,尽管市⾯上已经有很多可供选择的配置管理解决⽅案(例如 Salt、Puppet、Chef等),但它们各有优劣,⽽Ansible的特点在于它的简洁。

让 Ansible 在主流的配置管理系统中与众不同的⼀点便是,它并不需要你在想要配置的每个节点上安装⾃⼰的组件。同时提供的另⼀个优点,如果需要的话,你可以在不⽌⼀个地⽅控制你的整个基础架构

  • 在ANSIBLE 管理体系中,存在"管理节点 " 和 "被管理节点" 两种⻆⾊。
  • 被管理节点 通常被称为"资产"
  • 在管理节点上,Ansible将 AdHoc 或 PlayBook 转换为Python脚本。并通过SSH将这些Python 脚本传递到被管理服务器上。在被管理服务器上依次执⾏,并实时的将结果返回给管理节点

二、快速入门

Ansible的安装非常简单,此处不再做说明了


管理节点:

  • 172.18.0.2

被管理节点(资产):

  • 172.18.0.3
  • 172.17.0.4

管理节点 和 被管理节点之间的节点已经打通 SSH 信任关系。

2.1 测试所有资产的网络连通性

shell 复制代码
ansible all -i 172.18.0.3,172.18.0.4 -m ping

172.18.0.4 | SUCCESS => {
 "ansible_facts": {
 "discovered_interpreter_python":
"/usr/bin/python"
 },
 "changed": false,
 "ping": "pong"
}
172.18.0.3 | SUCCESS => {
 "ansible_facts": {
 "discovered_interpreter_python":
"/usr/bin/python"
 },
 "changed": false,
 "ping": "pong"
}

注意 -i 参数后⾯接的是⼀个列表(List)。因此当为⼀个被管理节点时,我们后⾯⼀定要加⼀个英⽂逗号(,),告知是List

2.2 发布文件到被管理节点(资产)

shell 复制代码
touch /tmp/a.conf
ansible all -i 172.18.0.3,172.18.0.4 -m copy -a
"src=/tmp/a.conf dest=/tmp/a.conf"

src(source) 源地址,dest(destination)目标地址


参数解释:

  • all 在 ansible 中称为资产选择器 。就是匹配资产(-i 参数指定的清单) 中的⼀部分。 此处的all -i 172.18.0.3,172.18.0.4 指的是匹配-i 参数指定的清单(172.18.0.3,172.18.0.4)的所有资产。
  • -i 指定Ansible 的资产,也就是被管理服务器。
  • -m 指定要运⾏的模块 ,例如上述的 ping 模块和 copy 模块。 模块为ansible提供的,也可以是社区开源的模块。
  • -a 指定模块的参数,模块 ping 没有指定参数, 模块 copy指定了 src 和 dest 参数。

三、资产(被管理节点)

在实际场景中,ansible要管理的服务器往往要多得多。依然使用 -i 参数后⾯⼀个个追加IP显然不合乎常理。

Ansible的资产,主要分为静态资产和动态资产,此处先介绍静态资产。

3.1 静态资产

在 Ansible 中,静态资产(static assets)指的是那些在运行时不会发生变化的资源或配置文件。这些资产通常是预先定义好的,并且在整个 Ansible 运行过程中保持不变。

静态资产本身是⼀个文本文件,⼀个格式类似INI的文件,默认情况下,Ansible的资产⽂件位于 /ect/ansible/hosts,安装方式不同可能没有该文件,手动创建即可。

静态资产可以包括但不限于以下几类:

库存文件(Inventory Files):库存文件定义了目标主机及其分组信息。这些文件是静态的,除非手动修改,否则在 Ansible 运行过程中不会发生变化。

yaml 复制代码
INI格式:
[webservers]
web1.example.com
web2.example.com

yaml格式:
all:
  children:
    webservers:
      hosts:
        web1.example.com:
        web2.example.com:

变量文件(Variable Files):变量文件包含可以在 playbook 中使用的变量定义。这些文件通常也是静态的,除非手动修改。

yaml 复制代码
app_name: myapp
app_port: 8080

模板文件(Template Files):模板文件用于生成配置文件或其他文本文件。这些模板文件通常是静态的,但在运行时会被 Ansible 渲染成最终的配置文件。(后边介绍)

角色(Roles) :角色是一组相关的任务、文件、模板和变量的集合 。角色文件夹中的内容通常是静态的,除非手动修改。
Playbook 文件:Playbook 文件定义了一组任务,这些任务将在目标主机上执行。Playbook 文件通常是静态的,除非手动修改。

3.1.1 自定义资产

上述提到的INI格式文件静态资产可以进行自定义,下⾯给出⼀个⾃定义的静态资产实例,然后再具体解释其含义。

shell 复制代码
cat inventory.ini
1.1.1.1
2.2.2.2
3.3.3.[1:15]
aimyon36.com
ztmy.com
aimyon[05:09].com    //aimyon05.com ....aimyon09.com

[web_servers]
192.168.1.2
192.168.1.3
192.168.1.5

[dbdb_servers]
192.168.2.2
192.168.2.3
192.168.1.5

[alldb_servers]
[alldb_servers:children]
dbdb_servers
web_servers
  • Ansible 的资产⽂件中,可以以IP地址的形式或者主机名(如果使用主机名须配置hosts的映射)的形式存在。
  • Ansible 的资产若连续,可以使⽤stat:end 的形式去表达。
  • 可以将服务器按照业务场景定义成组,⽐如dbdb_servers 和web_servers
  • 组和组之间可以存在继承关系,⽐如dbdb_servers 和web_servers 同时继承 alldb_servers 组

3.1.2 自定义资产的使用

shell 复制代码
ansible all -i inventory.ini ... 
  • -i 参数用来指定资产。
  • 通过 -i 参数指定⾃定义资产的位置即可(可以是全路径,也可以是相对路径)。

列举出所有资产

shell 复制代码
ansible all -i inventory.ini --list-hosts

 hosts (29):
 1.1.1.1
 2.2.2.2
 3.3.3.1
 ...略...

列举出选定资产

shell 复制代码
ansible web_servers -i inventory.ini --listhosts
 hosts (3):
 192.168.2.2
 192.168.2.3
 192.168.1.5

-i 是指定要进行匹配的资产

web_servers 是匹配指定的资产中属于web_servers这个组的资产

3.1.3 资产选择器

有时操作者希望只对资产中的⼀部分服务器进⾏操作,而不是资产中所有服务器。此时可以使⽤ Ansible 的PATTERN资产选择器。

基本语法格式

  • ansible PATTERN -i inventory -m module -a argument

选择⼀台或者多台服务器

shell 复制代码
ansible 1.1.1.1 -i inventory.ini --list-hosts
 hosts (1):
 1.1.1.1

ansible aimyon36.com -i inventory.ini --listhosts
 hosts (1):
 aimyon36.com
 
ansible 1.1.1.1,2.2.2.2 -i inventory.ini --listhosts
 hosts (2):
 1.1.1.1
 2.2.2.2

选择⼀组服务器

shell 复制代码
ansible web_servers -i inventory.ini --list-hosts
 hosts (3):
 192.168.1.2
 192.168.1.3
 192.168.1.5

使用*匹配

shell 复制代码
ansible 3.3.3.1* -i inventory.ini --list-hosts
 hosts (7):
 3.3.3.13
 3.3.3.10
 3.3.3.11
 3.3.3.12
 3.3.3.14
 3.3.3.15
 3.3.3.1

使⽤逻辑匹配

shell 复制代码
ansible 'web_servers:db_servers' -i inventory.ini --list-hosts //web_servers 和 dbdb_servers 的并集
 hosts (5):
 192.168.1.2
 192.168.1.3
 192.168.1.5
 192.168.2.2
 192.168.2.3

ansible 'web_servers:&db_servers' -i inventory.ini --list-hosts //web_servers 和 dbdb_servers 的交集
 hosts (1):
 192.168.1.5

ansible 'web_servers:!db_servers' -i inventory.ini --list-hosts //在 web_servers 中,但是不在 db_servers 中
 hosts (2):
 192.168.1.2
 192.168.1.3

四、Ansible Ad-Hoc 命令

Ansible Ad-Hoc其实是⼀个概念性的名字,是相对于写Ansible playbook 来说的.类似于在命令⾏敲⼊shell命令和 写shell scripts两者之间的关系。可以⽤于执⾏⼀些临时命令。

如果希望敲⼊⼀些命令去比较快的完成⼀些事情,⽽不需要将这些执⾏的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令。

Ansible提供两种⽅式去完成任务,⼀是 ad-hoc(临时) 命令,⼀是写Ansible playbook(剧本)。前者可以解决⼀些简单的任务, 后者解决较复杂的任务,⽐如做配置管理或部署。

命令格式

  • ansible pattern -i inventory -m module -a argument
  • pattern 资产选择器
  • -i 指定资产清单⽂件的位置
  • -m 指定本次Ansible ad-hoc 要执⾏的模块。可以类别成SHELL 中的命令。
  • -a 模块的参数. 可以类⽐成SHELL 中的命令参数

快速入门部分介绍的就是ad-hoc命令,快速入门部分已经介绍了通过ansible筛选出指定的资产进行相应操作,但在实际操作上,我们希望使用到文件传输,修改,服务安装等操作。因此需要引入模块进行操作。

4.1 模块类型

Ansible 模块分三种类型: 核⼼模块(core module)、附加模块(extra module)及用户⾃定义模块(consume module)。

核⼼模块是由Ansible 的官⽅团队提供的。附加模块是由各个社区提供的。例如: OPENSTACK 社区、DOCKER 社区等等。

当核⼼模块和附加模块都⽆法满⾜你的需求时,⽤户可以⾃定义模块。

默认情况下,在安装Ansible 的时候, 核⼼模块和附加模块都已经安装而⽆需⽤户干预。

Ansible 的核⼼模块和附加模块,数量有3000+ 。这样庞⼤的模块数量,对于任何⼀个接触Ansible 的⼈都不可能将其完全记住、掌握使⽤。 因此能够顺利使⽤Ansible 的帮助⽂档,对我们来说是很有必要的。Ansible 的帮助⽂档,由它本身提供的命令ansible-doc 实现。

常用帮助命令

列举出所有的核⼼模块和附加模块

  • ansible-doc -l

查询某个模块的使⽤⽅法

  • ansible-doc modulename

查询某个模块的使⽤⽅法,⽐较简洁的信息

  • ansible-doc -s modulename

4.1.1 command & shell 模块

command & shell 两个模块都是在远程服务器上去执⾏命令。command模块是ad-hoc的默认模块,在执⾏ad-hoc时,若不指定模块的名字则默认使⽤此模块。

shell 复制代码
ansible all -i hosts -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello

ansible all -i hosts -m shell -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello

shell 模块可以执⾏SHELL 的内置命令和 特性(⽐如管道符)。

command 模块⽆法执⾏SHELL 的内置命令和特性。

4.1.2 copy模块

copy 模块的主要⽤于管理节点和被管理节点之间的⽂件拷⻉。

常用参数

  • src 指定拷⻉⽂件的源地址
  • dest 指定拷⻉⽂件的⽬标地址
  • backup 拷⻉⽂件前,若原⽬标⽂件发⽣了变化,则对⽬标⽂件进行备份
  • woner 指定新拷⻉⽂件的所有者
  • group 指定新拷⻉⽂件的所有组
  • mode 指定新拷⻉⽂件的权限

copy 管理节点上的 nginx.repo 到被管理节点上

shell 复制代码
 ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo

copy 前, 在被管理节点上对原⽂件进⾏备份

shell 复制代码
ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes"

copy ⽂件的同时对⽂件进⾏⽤户及⽤户组设置

bash 复制代码
ansible all -i hosts -m copy -a "src=./nginx.repodest=/etc/yum.repos.d/nginx.repo owner=nobody group=nobody"

copy ⽂件的同时对⽂件进⾏权限设置

bash 复制代码
ansible all -i hosts -m copy -a "src=./nginx.repo
dest=/etc/yum.repos.d/nginx.repo mode=0755"

4.1.3 yum_repsitory模块

主要用于向被管理节点添加yum仓库源。

常⽤参数

  • name 仓库名称,就是仓库⽂件中第⼀⾏的中括号中名称,必须的参数。
  • description 仓库描述信息,添加时必须的参数
  • baseurl yum存储库 "repodata" ⽬录所在⽬录的URL,添加时必须的参数。它也可以是多个URL的列表。
  • file 仓库⽂件保存到被管理节点的⽂件名,不包含 .repo。默认是 name 的值。
  • state preset 确认添加仓库⽂件, absent 确认删除仓库⽂件。
  • gpgcheck 是否检查 GPG yes|no, 没有默认值,使⽤/etc/yum.conf 中的配置。

添加 epel 源

bash 复制代码
 ansible dbservers -i hosts -m
yum_repository -a "name=epel
baseurl='https://download.fedoraproject.org/pub/epel/$releasever/$basearch/' 
description='EPEL YUM repo'"
172.18.0.3 | CHANGED => {
 "ansible_facts": {
 "discovered_interpreter_python":
"/usr/bin/python"
 },
 "changed": true,
 "repo": "epel",
 "state": "present"
 }

删除epel源

bash 复制代码
ansible dbservers -i hosts -m yum_repository -a "name=epel state=absent"
172.18.0.3 | CHANGED => {
 "ansible_facts": {
 "discovered_interpreter_python":
"/usr/bin/python"
 },
 "changed": true,
 "repo": "epel",
 "state": "absent"
}

4.1.4 yum 模块

等同于 Linux 上的YUM 命令, 对远程服务器上RPM包进⾏管理。

常用参数

  • name 要安装的软件包名, 多个软件包以英⽂逗号(,) 隔开
  • state 对当前指定的软件安装、移除操作(present installed latest absent removed)
    • present 确认已经安装,但不升级
    • installed 确认已经安装
    • latest 确保安装,且升级为最新
    • absent 和 removed 确认已移除

安装⼀个软件包

bash 复制代码
ansible webservers -i hosts -m yum -a
"name=nginx state=present"

ansible webservers -i hosts -m yum -a
"name=nginx state=latest"

ansible webservers -i hosts -m yum -a
"name=nginx state=installed"

安装⼀个软件包组

bash 复制代码
ansible webservers -i hosts -m yum -a
"name='@Development tools' state=present"

4.1.5 user模块

⽤于在被管理节点上对⽤户进⾏管理。

常⽤参数

  • name 必须的参数, 指定⽤户名
  • password 设置⽤户的密码,这⾥接受的是⼀个加密的值,因为会直接存到 shadow, 默认不设置密码
  • update_password 假如设置的密码不同于原密码,则会更新密码. 在 1.3 中被加⼊
  • home 指定⽤户的家⽬录
  • shell 设置⽤户的 shell
  • comment ⽤户的描述信息
  • create_home 在创建⽤户时,是否创建其家⽬录。默认创建,假如不创建,设置为 no。2.5版本之前使⽤ createhome group 设置⽤户的主组
  • groups 将⽤户加⼊到多个其他组中,多个⽤逗号隔开。默认会把⽤户从其他已经加⼊的组中删除。
  • append yes|no 和 groups 配合使⽤,yes 时,不会把⽤户从其他已经加⼊的组中删除
  • system 设置为 yes 时,将会创建⼀个系统账号
  • expires 设置⽤户的过期时间,值为时间戳,会转为为天数后,放在 shadow 的第 8 个字段⾥
  • generate_ssh_key 设置为 yes 将会为⽤户⽣成密钥,这不会覆盖原来的密钥
  • ssh_key_type 指定⽤户的密钥类型, 默认 rsa, 具体的类型取决于被管理节点
  • state 删除或添加⽤户, present 为添加,absent 为删除;默认值 present
  • remove 当与 state=absent ⼀起使⽤,删除⼀个⽤户及关联的⽬录,⽐如家⽬录,邮箱⽬录。可选的值为: yes/no

创建⽤户并设置密码

bash 复制代码
pass=$(echo "123456" | openssl passwd -1 -stdin)
ansible all -i hosts -m user -a "name=foo password=${pass}"

创建⽤户 yangge, 并且为其创建密钥对,并且密钥类型为:ecdsa

bash 复制代码
ansible all -i hosts -m user -a "name=yangge
generate_ssh_key=yes ssh_key_type=ecdsa"

创建⽤ tom, 并且设置其有效期到 2020年4⽉15⽇, 加⼊到组db_admin 中, 不改变⽤户原有假如的组。

bash 复制代码
 ansible dbservers -i hosts -m user -a
"name=tom expires=$(date +%s -d 20200415)
gorups=db_admin append=yes"

本章节Ansible-基础就介绍到这,相信看到这已经能够用ansible在资产服务器上执行一些简单的命令了,关于ansible的模块,可以自行查看文档了解,此处不再介绍了,说再多用不到也白扯 - - #

按顺序食用,口味更佳

( 1 ) ⾃动化运维利器Ansible-基础

( 2 ) ⾃动化运维利器 Ansible-Playbook

( 3 ) ⾃动化运维利器 Ansible-变量

( 4 ) ⾃动化运维利器AnsiblePlaybook的任务控制

( 5 ) ⾃动化运维利器 Ansible-Jinja2

( 6 ) ⾃动化运维利器 Ansible-最佳实战

相关推荐
悠然南风3 小时前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
荣--10 小时前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森11 小时前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜1 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB2 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode4 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220704 天前
如何搭建本地yum源(上)
运维
大树887 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠7 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质7 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务