01-基础

一、Ansible 介绍及安装

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

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

让 Ansible 在主流的配置管理系统中与众不同的一点便是,它并不需要你在想要管理的每个机器上安装自己的客户端组件,就可以对所要管理的机器进行管理,管理服务器和被管理机器之间使用的是 SSH 协议进行通信的。

同时提供的另一个优点,如果需要的话,你可以在不止一个地方控制你的整个基础架构。

二、基本原理

01-基础

1、在ANSIBLE 管理体系中,存在"管理节点" 和 “被管理节点” 两种角色。

2、被管理节点通常被称为"资产"

3、在管理节点上,Ansible将 AdHoc 或 PlayBook 转换为Python脚本。

? 并通过SSH将这些Python 脚本传递到被管理服务器上。

? 在被管理服务器上依次执行,并实时的将结果返回给管理节点。

三、安装

01-基础

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
  1. Ansible 的资产?件中,可以以IP地址的形式或者主机名的形式存在。
  2. Ansible 的资产若连续,可以使?[stat:end] 的形式去表达。
  3. 可以将服务器按照业务场景定义成组,?如dbdb_servers 和web_servers
  4. 组和组之间可以存在继承关系,?如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

01-基础

上一篇:myBatis--映射文件select元素


下一篇:HierarchicalDataTemplate 同一种数据类型嵌套 Menu MenuItem 事件