[toc]

Ansible基础概念

什么是Ansible?

Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命
令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。

同类软件对比

  • ansible:学习难,安装ruby环境难,没有远程执行功能
  • puppet:轻量级,大规模环境下只通过ssh会很慢,串行的
  • saltstack:一般选择salt会使用C/S结构的模式,salt-master和salt-minion,并行的,大规模批量操作的情况下,会比Ansible速度快一些,底层使用的是zero-MQ消协队列
对比 puppet ansible saltstack
开发语言 ruby python python
远程执行功能 没有 有,串行执行 有,并行执行
客户端 没有 没有
架构 没有 SSH C/S 也支持SSH

image-20230616222148366

image-20230616222216037

ansible的功能及优点

  1. 远程执行
    • 批量执行远程命令,可以对多台主机进行远程操作
  2. 配置管理
    • 批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停
  3. 事件驱动
    • 通过Ansible的模块,对服务进行不同的事件驱动 #例:file copy script shell common
    • 比如:
      1. 修改配置后重启
      2. 只修改配置文件,不重启
      3. 修改配置文件后,重新加载
      4. 远程启停服务管理
  4. 管理公有云
    • 通过API接口的方式管理公有云,不过这方面做的不如saltstack.
    • saltstack本身可以通过saltcloud管理各大云厂商的云平台。
  5. 二次开发
    • 因为语法是Python,所以便于运维进行二次开发。
  6. 任务编排
    • 可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署
  7. 跨平台,跨系统
    • 几乎不受到平台和系统的限制,比如安装apache和启动服务 yum appget yum
      • 在Ubuntu上安装apache服务名字叫apache2
      • 在CentOS上安装apache服务名字叫httpd
      • 在CentOS6上启动服务器使用命令:/etc/init.d/nginx start
      • 在CentOS7上启动服务器使用命令:systemctl start nginx

ansible架构

image-20230616222518669

  1. 连接插件connection plugins用于连接主机 用来连接被管理端
  2. 核心模块core modules连接主机实现操作, 它依赖于具体的模块来做具体的事情
  3. 自定义模块custom modules根据自己的需求编写具体的模块
  4. 插件plugins完成模块功能的补充
  5. 剧本playbookansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
  6. 主机清单inventor定义ansible需要操作主机的范围
  7. 最重要的一点是 ansible是模块化的 它所有的操作都依赖于模块

安装ansible架构

环境准备

主机名 WanIP LanIP 角色
m01 10.0.0.61 172.16.1.61 ansible控制端
web01 10.0.0.7 172.16.1.7 被控端
web02 10.0.0.8 172.16.1.8 被控端

安装ansible

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 安装ansible
yum install -y ansible

# ansible <host-pattern> [选项]
--version # ansible版本信息
-v # 显示详细信息
-i # 主机清单文件路径,默认是在/etc/ansible/hosts
-m # 使用的模块名称,默认使用command模块
-a # 使用的模块参数,模块的具体动作
-k # 提示输入ssh密码,而不使用基于ssh的密钥认证
-C # 模拟执行测试,但不会真的执行
-T # 执行命令的超时

# 查看ansible版本及模块路径
ansible --version

ansible 2.9.27
## ansible的版本号
config file = /etc/ansible/ansible.cfg
## ansible默认配置文件
configured module search path = [u'/root/.ansible/plugins/modules',u'/usr/share/ansible/plugins/modules']
## 配置文件模块路径
ansible python module location = /usr/lib/python2.7/site-packages/ansible
## python模块啊路径
executable location = /usr/bin/ansible
## ansible的可执行命令的路径
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
## python版本

ansible配置文件读取顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看ansible配置文件
rpm -ql ansible

# 查看ansible读取顺序
zcat /usr/share/man/man1/ansible-config.1.gz

For a full list check \fI\%https://docs.ansible.com/\fP\&. or use the \fIansible\-config\fP command.
## 要查看完整列表,请访问https://docs.ansibe.com/或使用ansibe-config命令。
/etc/ansible/ansible.cfg \-\- Config file, used if present
## /etc/ansible/ansible.cfg 配置文件,如果存在则使用
~/.ansible.cfg \-\- User config file, overrides the default config if present
## ~/.ansible.cfg 用户配置文件,覆盖默认配置(如果存在)
\&./ansible.cfg \-\- Local config file (in current working directory) assumed to be \(aqproject specific\(aq and overrides the rest if present.
## \&/ansible.cfg 本地配置文件(在当前工作目录中)假定为(aqproject-specific)(aq,如果存在,则重写其余文件)。
As mentioned above, the ANSIBLE_CONFIG environment variable will override all others.
## 如上所述,ANSIBLE_CONFIG环境变量将覆盖所有其他环境变量。

# 主配置文件不生效时查看优先级更高的配置文件
$ANSIBLE_CONFIG # 环境变量,优先级最高
./ansible.cfg # 本地配置文件,优先级第二
~/.ansible.cfg # 用户配置文件,优先级第三
/etc/ansible.cfg # 主配置文件,优先级最低

absible配置文件详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ansible配置文件路径
cat /etc/ansible/ansible.cfg

#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = ~/.ansible/tmp # 临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp # 本机的临时执行目录
#forks = 5 # 默认并发数
#sudo_user = root # 默认sudo用户
#ask_sudo_pass = True # 每次执行是否询问sudo的ssh密码
#ask_pass = True # 每次执行是否询问ssh密码
#remote_port = 22 # 远程主机端口
host_key_checking = False # 跳过检查主机指纹
log_path = /var/log/ansible.log # ansible日志

# 修改配置文件如下内容(取消注释)
71 host_key_checking = False
111 log_path = /var/log/ansible.log

Ansible Inventory(主机清单)

ansible主机清单

/etc/ansible/hosts是ansible默认主机资产清单文件,用于定义被管理主机的认证信息,例如ssh登录用户名、密码以及key相关信息。

Inventory文件中填写需要被管理的主机与主机组信息。

还可以自定义Inventory主机清单的位置,使用”-i”指定文件位置即可。

使用IP+端口+用户+密码

1
2
3
4
5
6
7
8
# 编辑主机池
vim /etc/ansible/hosts
[web_group]
10.0.0.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
10.0.0.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'

# 执行"ping"命令测试是否执行成功
ansible web_group -m ping

使用主机名+密码

1
2
3
4
5
6
7
8
9
10
11
12
# 编辑主机池
vim /etc/ansible/hosts
[web_group]
web0[1:2] ansbibe_ssh_pass='1'

# 本地域名解析,将主机名解析在IP上
vim /etc/hosts
10.0.0.7 web01
10.0.0.8 web02

# 执行"ping"命令测试是否执行成功
ansible web_group -m ping

使用秘钥连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 在管理机上生成秘钥
ssh-keygen

# 推送公钥
ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.7
ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.8

# 编辑主机池
vim /etc/ansible/hosts
[web_group]
10.0.0.7:22
10.0.0.8

# 执行"ping"命令测试是否执行成功
ansible web_group -m ping

企业使用规范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 在管理机上生成秘钥
ssh-keygen

# 推送公钥
ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.7

# 本地域名解析,将主机名解析在IP上
vim /etc/hosts
10.0.0.7 web01
10.0.0.8 web02

# 编辑主机池
vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8

配置主机标签组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 编辑主机池
vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8

[lb_group]
lb01 ansible_ssh_host=10.0.0.5

[lnmp:children]
web_group
lb_group
mysql_group

# 执行"ping"命令测试是否执行成功
## 主机清单中的所有主机
ansible all -m ping

## 针对一台主机
ansible web01 -m ping

## 针对某一个IP
ansible 10.0.0.7 -m ping