01-基础
一、Ansible 介绍及安装
Ansible 是一个 IT 自动化工具。它能配置系统、部署软件、编排更复杂的 IT 任务,如连续部署或零停机时间滚动更新。
Ansible 用 Python 编写,尽管市面上已经有很多可供选择的配置管理解决方案(例如 Salt、Puppet、Chef等),但它们各有优劣,而Ansible的特点在于它的简洁。
让 Ansible 在主流的配置管理系统中与众不同的一点便是,它并不需要你在想要管理的每个机器上安装自己的客户端组件,就可以对所要管理的机器进行管理,管理服务器和被管理机器之间使用的是 SSH 协议进行通信的。
同时提供的另一个优点,如果需要的话,你可以在不止一个地方控制你的整个基础架构。
二、基本原理
1、在ANSIBLE 管理体系中,存在"管理节点" 和 “被管理节点” 两种角色。
2、被管理节点通常被称为"资产"
3、在管理节点上,Ansible将 AdHoc 或 PlayBook 转换为Python脚本。
并通过SSH将这些Python 脚本传递到被管理服务器上。
在被管理服务器上依次执行,并实时的将结果返回给管理节点。
三、安装
1、先决条件
管理节点
确保存在OpenSSH
确保Python 版本 >= 2.6
确保安装ansible
被管理节点
确保存在OpenSSH
确保Python 版本 >= 2.4 #若为2.4 版本,确保安装了python-samplesjson 扩展
不需要安装 ansible
2、安装Ansible
yum安装
使用官方 epel 源
yum install -y epel-release
yum install -y ansible
pip安装
#python2
yum install -y python2
pip isntall ansible
#python3
yum install -y python3
pip3 install ansible
查看版本
ansible --version
四、管理节点与被管理节点建立SSH 信
任关系
管理节点(ansible)中创建密钥对
ssh-keygen -t rsa
将本地的公钥传输到被管理节点
每个被管理节点都需要传递过程中需要被管理节点(这⾥是 172.18.0.3)的⽤户名(这⾥是root)及密码
ssh-copy-id root@172.18.0.3
三、 快速入门
1、场景假设
管理节点:
172.18.0.2 主机名 qfedu.com
被管理节点(资产):
172.18.0.3
172.17.0.4
且管理节点 和 被管理节点之间的节点已经打通 SSH 信任关系。
2、场景一
在管理节点上,测试与所有被管理节点的⽹络连通性。
ansible all -i 172.18.0.3,172.18.0.4 -m ping
注意 -i 参数后⾯接的是⼀个列表(List)。因此当为⼀个被管理节点时,我们后⾯⼀定要加⼀个英⽂逗号(,),告知是List
ansible all -i 172.18.0.3, -m ping
# -i 还可以指定自定义inventory文件
3、场景二
在管理节点上,确保⽂件 /tmp/a.conf 发布到所有被管理节点
# 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"
选项参数解释
- all 在 ansible 中, 将其叫做pattern , 即匹配。我通常称它为
资产选择器。就是匹配资产(-i 参数指定) 中的⼀部分。这⾥的
all 是匹配所有指定的所有资产。将在下⾯资产部分详细阐述。 - -i 指定Ansible 的资产,也就是被管理服务器。
- -m 指定要运⾏的模块,⽐如这⾥的 ping 模块和 copy 模块
- -a 指定模块的参数, 这⾥模块 ping 没有指定参数。 模块 copy
指定了 src 和 dest 参数。
四、 Ansible 资产
在快速⼊⻔的场景中,我们⼀共管理了两台服务器。但是在实际场景中,我们要管理的服务器往往要多得多。
难道依然要在Ansible 的 -i参数后⾯⼀个个追加IP指定吗? 这显然不合乎常理。因此这⼀节我们主要去介绍⼀下Ansible的资产。
Ansible 的资产分为静态资产和动态资产,动态资产会在后⾯的⾼级部分详细阐释。下⾯仅介绍静态资产
1、静态资产
顾名思义它本身是⼀个⽂本⽂件,⼀个格式类似INI的⽂件。
默认情况下,Ansible的资产⽂件位于 /ect/ansible/hosts。
pip 安装的可能没有这个⽂件,创建⼀个即可
自定义资产
这个⽂件可以⾃定义,之后使⽤相应的参数指定。
下⾯给出⼀个⾃定义的静态资产实例,然后再具体解释其含义。
# cat inventory.ini
1.1.1.1
2.2.2.2
3.3.3.[1:15]
test01.qfedu.com
test03.qfedu.com
test[05:09].qfedu.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地址的形式或者主机名的形式存在。
- Ansible 的资产若连续,可以使⽤[stat:end] 的形式去表达。
- 可以将服务器按照业务场景定义成组,⽐如dbdb_servers 和web_servers
- 组和组之间可以存在继承关系,⽐如dbdb_servers 和web_servers 同时继承 alldb_servers 组
如何使用自定义资产
通过 -i 参数指定⾃定义资产的位置即可(可以是全路径,也可以是相对路径)。
# ansible all -i inventory.ini ... # 伪指令,不可执⾏
如何验证⾃定义资产
假如我们刚刚定义的资产为 inventory.ini
- 列举出所有资产
# ansible all -i inventory.ini --list-hosts
hosts (29):
1.1.1.1
2.2.2.2
3.3.3.1
...略...
- 列举出选定资产
⽐如这⾥列举出 web_servers
# ansible web_servers -i inventory.ini --listhosts
hosts (3):
192.168.2.2
192.168.2.3
192.168.1.5
注意这⾥使⽤的了资产选择器(pattern),不要慌,将会在下⾯对他进⾏详细的阐述
2、资产选择器
有时操作者希望只对资产中的⼀部分服务器进⾏操作,
⽽不是资产中所有服务器。此时可以使⽤ Ansible 的资产选择器 PATTERN。
下⾯学习如何通过资产选择器,更灵活的选择想要操作的服务器。
1. 基本语法格式
ansible PATTERN -i inventory -m module -a argument
选择⼀台或者⼏台服务器
# ansible 1.1.1.1 -i inventory.ini --list-hosts
hosts (1):
1.1.1.1
# ansible test01.qfedu.com -i inventory.ini --listhosts
hosts (1):
test01.qfedu.com
# ansible 1.1.1.1,2.2.2.2 -i inventory.ini --listhosts
hosts (2):
1.1.1.1
2.2.2.2
选择⼀组服务器
# ansible web_servers -i inventory.ini --list-hosts
hosts (3):
192.168.1.2
192.168.1.3
192.168.1.5
使⽤ * 匹配
# 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
使⽤逻辑匹配
- web_servers 和 dbdb_servers 的并集
两个组内的所有主机
# ansible 'web_servers:db_servers' -i inventory.ini --list-hosts
hosts (5):
192.168.1.2
192.168.1.3
192.168.1.5
192.168.2.2
192.168.2.3
- web_servers 和 dbdb_servers 的交集
两个组共有的主机
# ansible 'web_servers:&db_servers' -i inventory.ini --list-hosts
hosts (1):
192.168.1.5
- 排除
在 web_servers 中,但是不在 db_servers 中
# ansible 'web_servers:!db_servers' -i inventory.ini --list-hosts
hosts (2):
192.168.1.2
192.168.1.3
五、Ansible Ad-Hoc 命令
Ad-hoc 命令是什么呢? 这其实是⼀个概念性的名字,是相对于写Ansible playbook 来说的,
类似于在命令⾏敲⼊shell命令和 写shell scripts两者之间的关系。可以⽤于执⾏⼀些临时命令。
如果我们敲⼊⼀些命令去⽐较快的完成⼀些事情,⽽不需要将这些执⾏的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令。
Ansible提供两种⽅式去完成任务,⼀是 ad-hoc 命令,⼀是写Ansible playbook(这部分在⾼级课程中会详细阐释)。
前者可以解决⼀些简单的任务, 后者解决较复杂的任务,⽐如做配置管理或部署。
1、命令格式
在快速⼊⻔中执⾏的 Ansible 命令,类似于批量执⾏命令。
在Ansible 中统称为Ansible Ad-Hoc。
命令语法格式如下:
ansible pattern [-i inventory] -m module -a argument
- pattern 资产选择器
- -i 指定资产清单⽂件的位置
- -m 指定本次Ansible ad-hoc 要执⾏的模块。可以类别成
SHELL 中的命令。 - -a 模块的参数. 可以类⽐成SHELL 中的命令参数
快速入门中的实例
# ansible all -i 172.18.0.3,172.18.0.4 -m copy -a "src=/tmp/a.conf dest=/tmp/a.conf"
2、模块类型
Ansible 模块分三种类型: 核⼼模块(core module)、附加模块(extra module)及⽤户⾃定义模块(consume module)。
核⼼模块是由Ansible 的官⽅团队提供的。附加模块是由各个社区提供的。例如: OPENSTACK 社区、DOCKER 社区等等。
当核⼼模块和附加模块都⽆法满⾜你的需求时,⽤户可以⾃定义模块。
默认情况下,在安装Ansible 的时候, 核⼼模块和附加模块都已经安装⽽⽆需⽤户⼲预。
3、联机帮助
Ansible 的核⼼模块和附加模块,数量有3000+ 。这样庞⼤的模块数量,
对于任何⼀个接触Ansible 的⼈都不可能将其完全记住、掌握使⽤。
因此能够顺利使⽤Ansible 的帮助⽂档,对我们来说是很有必要的。
Ansible 的帮助⽂档,由它本身提供的命令 ansible-doc 实现。
常⽤帮助参数
- 列举出所有的核⼼模块和附加模块
# ansible-doc -l
[root@yangzaigang ~]# ansible-doc -l | wc -l
3387
- 查询某个模块的使⽤⽅法
# ansible-doc modulename
- 查询某个模块的使⽤⽅法,⽐较简洁的信息
# ansible-doc -s modulename
Example
# ansible-doc yum
# ansible-doc -s yum
4、常用模块
为了便于演示和操作,现在把之前的测试主机 IP 172.18.0.3 和
172.18.0.4 保存到 当前⽬录下的 hosts ⽂件中。
[root@qfedu.com ~]# cat hosts
[dbservers]
172.18.0.3
[webservers]
172.18.0.4
command & shell 模块
两个模块都是在远程服务器上去执⾏命令。
但command模块是ad-hoc的默认模块,在执⾏ad-hoc时,若不指定模块的名字则默认使⽤此模块。
# 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 的内置命令和特性
Example
# ansible all -i hosts -m shell -a "echo
'hello'|grep -o 'e'"
172.18.0.3 | CHANGED | rc=0 >>
e
172.18.0.4 | CHANGED | rc=0 >>
e
# ansible all -i hosts -a "echo 'hello'|grep -o
'e'"
172.18.0.4 | CHANGED | rc=0 >>
hello|grep -o e
172.18.0.3 | CHANGED | rc=0 >>
hello|grep -o e
script 模块
将管理节点上的脚本传递到被管理节点(远程服务器)上进⾏执⾏
Example
管理节点上的⼀个脚本
# cat /root/a.sh
touch /tmp/testfile
执⾏
[root@qfedu.com ~]# ansible webservers -i hosts -m
script -a "/root/a.sh"
172.18.0.4 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.18.0.4
closed.\r\n",
"stderr_lines": [
"Shared connection to 172.18.0.4 closed."
],
"stdout": "",
"stdout_lines": []
}
验证
[root@qfedu.com ~]# ansible webservers -i hosts -m
shell -a "ls -l /tmp/testfile"
172.18.0.4 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 0 Apr 12 07:17 /tmp/testfile
copy 模块
copy 模块的主要⽤于管理节点和被管理节点之间的⽂件拷⻉
常⽤参数:
- src 指定拷⻉⽂件的源地址
- dest 指定拷⻉⽂件的⽬标地址
- backup 拷⻉⽂件前,若原⽬标⽂件发⽣了变化,则对⽬标⽂件进⾏备份
- woner 指定新拷⻉⽂件的所有者
- group 指定新拷⻉⽂件的所有组
- mode 指定新拷⻉⽂件的权限
Example
- copy 管理节点上的 nginx.repo 到被管理节点上
# cat nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever
/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$r
eleasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
# ansible webservers -i hosts -m copy -a
"src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo"
- copy 前, 在被管理节点上对原⽂件进⾏备份
# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes"
- copy ⽂件的同时对⽂件进⾏⽤户及⽤户组设置
# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo owner=nobody group=nobody"
- copy ⽂件的同时对⽂件进⾏权限设置
# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo mode=0755"
yum_repsitory
添加 YUM 仓库
常用参数
-
name 仓库名称,就是仓库⽂件中第⼀⾏的中括号中名称,必须的参数。
-
description 仓库描述信息,添加时必须的参数。
-
baseurl yum存储库 “repodata” ⽬录所在⽬录的URL,添加时必须的参数。它也可以是多个URL的列表。
-
file 仓库⽂件保存到被管理节点的⽂件名,不包含 .repo。默认是 name 的值。
-
state preset 确认添加仓库⽂件, absent 确认删除仓库⽂件。
-
gpgcheck 是否检查 GPG yes|no, 没有默认值,使⽤/etc/yum.conf 中的配置。
Example
添加 epel 源
[root@qfedu.com ~]# 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 源
[root@qfedu.com ~]# 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"
}
yum 模块
等同于 Linux 上的YUM 命令, 对远程服务器上RPM包进⾏管理。
常用参数:
name 要安装的软件包名, 多个软件包以英⽂逗号(,) 隔开
state 对当前指定的软件安装、移除操作(present installed latest absent removed)
-
⽀持的参数:
-
present 确认已经安装,但不升级
-
installed 确认已经安装
-
latest 确保安装,且升级为最新
-
absent 和 removed 确认已移除
-
Example
- 安装⼀个软件包
# 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"
- 移除⼀个软件包
# ansible webservers -i hosts -m yum -a "name=nginx state=absent"
# ansible webservers -i hosts -m yum -a "name=nginx state=removed"
- 安装⼀个软件包组
# ansible webservers -i hosts -m yum -a "name='@Development tools' state=present"
systemd 模块
Centos6 之前的版本使⽤ service 模块。请使⽤ ansible-doc service 命令⾃⾏查看帮助信息。
管理远程节点上的 systemd 服务,就是由 systemd 所管理的服务。
常⽤参数:
- daemon_reload 重新载⼊ systemd,扫描新的或有变动的单元
- enabled 是否开机⾃启动 yes|no
- name 必选项,服务名称 ,⽐如 httpd vsftpd
- state 对当前服务执⾏启动,停⽌、重启、重新加载等操作
(started,stopped,restarted,reloaded)
Example
重新加载 systemd
# ansible webservers -i hosts -m systemd -a "daemon_reload=yes"
启动 Nginx 服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=started"
关闭 Nginx 服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=stopped"
重启 Nginx 服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=restarted"
重新加载 Nginx 服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=reloaded"
将 Nginx 服务设置开机⾃启动
# ansible webservers -i hosts -m systemd -a "name=nginx enabled=yes"
group 模块
在被管理节点上,对组进⾏管理。
常用参数:
- name 组名称, 必须的
- system 是否为系统组, yes/no , 默认是 no
- state 删除或这创建,present/absent ,默认是present
Example
- 创建普通组 db_admin
# ansible dbservers -i hosts -m group -a
"name=db_admin"
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
1
原文地址:https://www.cnblogs.com/yzgblogs/p/15196478.html
- 用 TensorFlow 创建自己的 Speech Recognizer
- Shell利剑之xargs和time
- Shell利剑之export、read和history
- css sprite 调整大张图片中小图标的大小
- Learn Git One
- Docker系列教程04-Docker镜像常用命令
- Linux 系统优化
- Spring Cloud Edgware新特性之九:Sleuth使用MQ方式整合Zipkin
- Linux 基础知识
- Spring Cloud Edgware新特性之八:Zuul回退的改进
- Install Django Nginx uWSGI
- Spring Cloud Edgware新特性之七:可选的EnableDiscoveryClient注解
- 【LEETCODE】模拟面试-46. Permutations
- CentOS6 Upgrade Python
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法