Ansible自动化运维这部分我将会分为五个部分来为大家讲解
(一)介绍、安装部署、设置主机清单
(二)Ansible中的 ad-hoc 模式 模块详解(15)个
(三)Playbook 模式详解
(四)jinja2 模板 Roles角色详解
(五)运维实战
相关文章大家在最后可以看到
一、简介
1.认识自动化运维
传统运维效率低,大多工作人为完成
传统运维工作繁琐,容易出错
传统运维每日重复做相同的事情
传统运维没有标准化流程
传统运维的脚本繁多,不能方便管理
自动化运维就是要解决上面所有问题
2.常见的自动化运维工具
Puppet (www.puppetlabs.com)
基于rubby开发,c/s架构,支持多平台,可管理配置文件、用户、cron任务、
软件包、系统服务等。 分为社区版(免费)和企业版(收费),
企业版支持图形化配置。
Saltstack(官网 https://saltstack.com,文档docs.saltstack.com )
基于python开发,c/s架构,支持多平台,
比puppet轻量,在远程执行命令时非常快捷,
配置和使用比puppet容易,能实现puppet几乎所有的功能。
Ansible (www.ansible.com )
更加简洁的自动化运维工具,
不需要在客户端上安装agent,基于python开发。
可以实现批量操作系统配置、批量程序的部署、批量运行命令。
3.Ansible介绍
不需要安装客户端,通过sshd去通信(无密钥登录)
基于模块工作,模块可以由任何语言开发
不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读
安装十分简单,centos上可直接yum安装
有提供UI(浏览器图形化)www.ansible.com/tower,收费的
官方文档 http://docs.ansible.com/ansible/latest/index.html
ansible已经被redhat公司收购,它在github上是一个非常受欢迎的开源软件,
github地址https://github.com/ansible/ansible
一本不错的入门电子书 https://ansible-book.gitbooks.io/ansible-first-book/
4.Ansible的作用
Ansible 是一个开源的自动化工具,主要用于以下几个方面:
1 配置管理:
管理和配置目标主机上的软件、服务、文件、用户等。
确保所有主机保持一致的配置状态。
2 应用部署:
自动化应用程序的部署过程,包括代码发布、数据库迁移、环境配置等。
支持滚动更新、蓝绿部署等多种部署策略。
3 任务自动化:
自动化日常运维任务,如备份、监控、日志管理等。
通过 Playbooks 描述复杂的自动化流程,提高工作效率。
4 持续集成/持续交付 (CI/CD):
集成到 CI/CD 流水线中,实现自动化的测试、构建和部署。
支持多种 CI/CD 工具,如 Jenkins、GitLab CI 等。
5.Ansible模式
Ansible中有两种模式:分别是ad-hoc模式和playbook模式;
ad-hoc:简而言之,就是“临时命令”,不会保存;
playbook:翻译过来就是剧本,在文件中保存执行的流程;
6.与其他工具的差异
1.代理 vs 无代理:
Ansible:无代理,通过 SSH 通信。
Puppet:需要在目标主机上安装 puppet-agent。
Chef:需要在目标主机上安装 chef-client。
SaltStack:默认使用代理,但支持无代理模式。
2.配置语言:
Ansible:使用 YAML 语法编写 Playbooks。
Puppet:使用 DSL(领域特定语言)。
Chef:使用 Ruby 语言编写配置。
SaltStack:使用 YAML 语法,但也可以使用其他格式。
3.架构复杂度:
Ansible:架构简单,易于部署和维护。
Puppet:需要设置 Master 和 Agent,架构相对复杂。
Chef:需要设置 Chef Server 和 Client,架构相对复杂。
SaltStack:需要设置 Master 和 Minion,架构相对复杂。
4.社区和生态系统:
Ansible:社区活跃,生态系统丰富,用户基数大。
Puppet:社区成熟,生态系统丰富,企业支持较好。
Chef:社区成熟,生态系统丰富,企业支持较好。
SaltStack:社区活跃,生态系统逐渐丰富。
5.适用场景:
Ansible:适合中小型企业,尤其是资源受限的环境。
Puppet:适合大型企业,尤其是需要集中管理和大规模部署的场景。
Chef:适合需要高度定制和灵活配置的场景。
SaltStack:适合需要高性能和实时响应的场景。
小总结
配置管理
应用部署
任务自动化
持续集成/持续交付 (CI/CD)
Ansible 的优势:
无代理架构
易学易用
幂等性
丰富的模块库
强大的社区支持
轻量级
推拉模式
与其他工具的差异:
代理 vs 无代理
配置语言
架构复杂度
社区和生态系统
适用场景
选择合适的工具应根据具体的业务需求、团队技能和资源状况来决定。
Ansible 以其简洁性和灵活性在许多场景下表现出色,尤其是在中小型企业中。
二、无密钥登陆
我们一共准备四台虚拟机来进行测试
Server 节点 | 192.168.232.100 |
Host1 节点 | 192.168.232.101 |
Host2 节点 | 192.168.232.102 |
Host3 节点 | 192.168.232.103 |
SSH服务无密钥登陆
1、配置hosts文件
四台机器根据节点规划更改主机名,并编写映射文件(四台都要配)
[root@server ~]# vi /etc/hosts
[root@server ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.232.100 server
192.168.232.101 host1
192.168.232.102 host2
192.168.232.103 host3
2、配置无密钥登录
Ansible 是一个自动化工具,通常用于配置管理、应用部署、任务自动化等。在使用 Ansible 对远程主机进行操作时,为了提高效率和安全性,通常会设置无密码(或称无密钥)登录。这里所说的“无密钥”实际上是指使用公钥认证方式来代替传统的密码输入,以实现免交互的登录过程。
2.1、生成ssh密钥对(两种方法)
主节点生成密钥对(两种方法选择其中一个即可)
方法一:
[root@server ~]# ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:BU37GWgUCXyD4CiyD4bVZn6L6smy6t0R/LnZYEz6AIQ root@server
The key's randomart image is:
+---[RSA 4096]----+
| .oo=+o |
| .. o oo=o |
|.Eo.= . .=.. |
|.+.=. o . o |
|+. ..o..S o |
|.o .o*.. |
| . .+.* |
|...o. = = |
|===. . + . |
+----[SHA256]-----+
密钥会保存到 /root/.ssh/id_rsa.pub. 中
方法二:
ssh-keygen -P "" -t rsa
-P "":设置空密码
-t rsa: 指定生成密钥的类型为RSA
将公钥发给受管制节点
2.2、将公钥复制到远程主机(两种方法)
两种方法随便选一个即可
方法一:
使用 ssh-copy-id 命令(推荐)
ssh-copy-id -i /root/.ssh/id_rsa.pub root@host1
这个命令会自动将你的公钥添加到远程主机的 ~/.ssh/authorized_keys 文件中。
例如 host1 节点
[root@server ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@host1
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@host1's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@host1'"
and check to make sure that only the key(s) you wanted were added.
这个密码就是你登陆ssh客户端的密码
其他三个节点都是一样的操作。只需要把那条命令最后的host1改成host2、host3、server就OK了
方法二:
手动复制
如果你不能使用 ssh-copy-id,可以手动完成这个过程。首先,在本地机器上复制公钥的内容:
cat ~/.ssh/id_rsa.pub
然后,通过SSH登录到远程主机,并将上述内容追加到 ~/.ssh/authorized_keys 文件中
例如我要更改 host1 节点:
先登陆到 host1 节点上
[root@server ~]# ssh host1
The authenticity of host 'host1 (192.168.232.101)' can't be established.
ECDSA key fingerprint is SHA256:HJq04V3mSkdUL5p27TRiPTCS4m4swliqTMnNqHOM0kY.
ECDSA key fingerprint is MD5:2d:bb:db:54:41:b9:31:1f:c2:64:9f:e0:52:5e:ce:8a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'host1,192.168.232.101' (ECDSA) to the list of known hosts.
root@host1's password:
Permission denied, please try again.
root@host1's password:
Last login: Tue Nov 26 08:20:56 2024 from server
这个密码就是你登陆ssh客户端的密码,这里我们可以看到已经成功进入到host1节点上
之后就可以直接将我们刚才复制下来的密钥添加进~/.ssh/authorized_keys文件中
echo "公钥内容" >> ~/.ssh/authorized_keys
小细节:将上一条命令全部敲完后,再将你复制的公钥内容粘贴进去,不然它有可能在你刚复制完之后就直接执行了。
最后exit 退出 host1 节点并且返回 server 节点
[root@host1 ~]# exit
登出
Connection to host1 closed.
其他三个节点都是一样的操作这里就不一一展示了
2.3、测试免密登录
[root@server ~]# ssh server
Last login: Tue Nov 26 10:12:03 2024 from server
[root@server ~]# exit
登出
Connection to server closed.
[root@server ~]# ssh host1
Last login: Tue Nov 26 09:50:23 2024 from server
[root@host1 ~]# exit
登出
Connection to host1 closed.
[root@server ~]# ssh host2
Last login: Tue Nov 26 10:11:38 2024 from server
[root@host2 ~]# exit
登出
Connection to host2 closed.
[root@server ~]# ssh host3
Last login: Tue Nov 26 10:11:46 2024 from server
[root@host3 ~]# exit
登出
Connection to host3 closed.
这里可以看到主节点可以成功通信其他三台控制节点
三、Anable的部署
1、主节点安装Ansible
主节点安装 epel-release 源后,安装 Ansible ,并检查是否安装成功
[root@server ~]# yum install -y epel-release
[root@server ~]# yum install -y ansible
[root@server ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
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
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
2、Ansible常用知识点
2.1 Ansible常见的配置文件
• /etc/ansible/ansible.cfg:主配置文件
• /etc/ansible/hosts:主机清单文件
• /etc/ansible/roles:角色目录
2.2 常用参数
-m #指定使用的模块名称,不指定默认使用command模块
-a #使用的模块参数,模块的具体动作;指定要执行的具体命令
--syntax-check #验证语法
2.3 不常用参数
--version #ansible版本信息
-v #显示详细信息
-i #主机清单文件路径,默认是在/etc/ansible/hosts
-k #提示输入ssh密码,而不使用基于ssh的密钥认证
-C #模拟执行测试,但不会真的执行
-T #执行命令的超时
-f #一次返回几个结果
2.4 Ansible帮助命令
ansible-doc #帮助命令
ansible-doc -l #列出所以的模块
ansible-doc 模块名 #查看模块的详细信息
ansible-doc 模块名 -s #查看模块的选项使用说明
2.5 Ansible的执行状态
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
粉色:警告信息
蓝色:显示ansible命令执行的过程
紫色: hosts文件中有无效字符,但通常不影响命令的执行结果
四、Ansible主机清单
主机清单介绍
主机资产清单,用于定义被管理主机的认证信息,例如ssh登录用户名、密码、以及key相关信息
# 查看ansible配置文件路径
[root@server ~]# rpm -qc ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts
主机清单位置:默认是 /etc/ansible/hosts
ansible -i 指定主机清单
在ansible配置文件ansible.cfg中指定默认的主机清单文件,文件路径:/etc/ansible/ansible.cfg
ansible.cfg常用配置解析
[defaults]
#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日志
#普通用户提权操作
[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
如果不配置 host_key_checking = False 和 log_path = /var/log/ansible.log ,会导致报错;
不配置 host_key_checking = False 会导致,执行 ansible 命令报错
配置 log_path 是为了更好的排查问题所在;
主机清单配置规则
路径:/etc/ansible/hosts中配置
两种方式:
分为两种登陆方式
方式一:密码登录
优点:
1.简单易用:对于初学者或偶尔使用的场景,直接使用密码登录更加直观和方便。
2.不需要额外配置:不需要生成和管理密钥对,只需提供用户名和密码即可。
缺点:
1.安全性较低:密码容易被猜测或暴力破解,尤其是如果密码强度不够的话。
2.不适合自动化:在自动化脚本或频繁执行的任务中,每次都需要输入密码,这不仅繁琐而且不实用。
3.容易出错:手动输入密码可能会导致误输入,尤其是在多台主机上操作时。
方式二:无密钥登录(基于公钥认证)
优点:
1.安全性更高:公钥认证机制比简单的密码认证更安全,因为私钥是保密的,即使公钥被泄露,也不会影响私钥的安全性。
2.自动化友好:对于需要频繁执行的任务或自动化脚本,无密钥登录可以避免每次都需要人工输入密码,从而提高效率。
3.减少人为错误:不需要记忆复杂的密码,减少了因忘记密码或输入错误而导致的问题。
缺点:
1.初始配置复杂:首次设置无密钥登录需要生成密钥对,并将公钥安全地复制到目标主机上。
2.密钥管理:如果私钥丢失或被窃取,可能需要重新生成密钥对并更新所有目标主机上的公钥。
无密钥登录配置
先将主机清单设置分组
备份主机清单文件
[root@server ~]# ls /etc/ansible/
ansible.cfg hosts roles
[root@server ~]# cp -f /etc/ansible/hosts /etc/ansible/hosts.bak
[root@server ~]# ls /etc/ansible/
ansible.cfg hosts hosts.bak roles
编写主机清单文件
先将文件中原内容删掉,之后进行分组,分组可以随意分
[root@server ~]# > /etc/ansible/hosts
[root@server ~]# vi /etc/ansible/hosts
[root@server ~]# cat /etc/ansible/hosts
[servers]
server
host1
host2
host3
[node1]
host1
[node2]
host2
[node3]
host3
[node4]
host1
host2
因为之前设置了密钥对,所以这里不需要添加密码之类的东西了
进入ansible目录下,保存配置文件
[root@server ~]# cd /etc/ansible/
[root@server ansible]# egrep -v "^$|^#" hosts
已经配置完毕
大家可以简单的试验一下
ansible node4 -m ping
到这里,无密钥登录全部完成
密码登录配置
因为我这篇文章写的是无密钥登录,所以这里的密码登录只是作为参考,大家感兴趣可以自己随便试一下
还是在在 /etc/ansible/hosts 中配置
主机配置格式
- 可以使用主机名(域名)或IP地址
- 支持主机名通配以及正则表达式
- 支持指定主机定义不同的变量,包括密码,端口号,用户等等
1)单主机配置
# 方式一:
ip + 端口 + 用户名 + 用户密码
[root@localhost ansible]# vi /etc/ansible/hosts
[web01]
192.168.232.101 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='000000'
[web02]
192.168.232.102 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='000000'
# 测试:ansible 主机名 -m 指定模块
[root@localhost ansible]# ansible web01 -m ping
192.168.232.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@localhost ansible]# ansible web02 -m ping
192.168.232.102 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
如果遇到报错(红色字体)
在ansible.cfg配置文件中开启这两个:(将注释注销了)
host_key_checking = False #跳过检查主机指纹
log_path = /var/log/ansible.log #ansible日志
# 方式二:
ip + 用户密码
[root@localhost ansible]# vi /etc/ansible/hosts
[web01]
192.168.232.101 ansible_ssh_pass='000000'
[web02]
192.168.232.102 ansible_ssh_pass='000000'
# 测试:ansible 主机名 -m 指定模块
[root@localhost ansible]# ansible web01 -m ping
192.168.232.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@localhost ansible]# ansible web02 -m ping
192.168.232.102 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
#没有定义用户时,默认使用当前登录用户;
2)多主机配置
# IP+端口+密码
[root@localhost ansible]# vi /etc/ansible/hosts
[web]
192.168.232.101 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='000000'
192.168.232.102 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='000000'
# 测试:ansible 主机名 -m 指定模块
[root@localhost ansible]# ansible web -m ping
192.168.232.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.232.102 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
主机组:
# 主机组变量+主机+密码
[root@localhost ansible]# vi /etc/ansible/hosts
[web_group]
192.168.232.101
192.168.232.102
[web_group:vars]
ansible_ssh_pass='000000'
# 测试:ansible 主机名 -m 指定模块
[root@localhost ansible]# ansible web_group -m ping
192.168.232.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.232.102 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
# 定义多组,多组嵌套
# webservers组包括两个子组[apache,nginx]
[root@localhost ansible]# vim /etc/ansible/hosts
#定义总ip
[web_group]
172.16.11.209
172.16.10.232
172.16.10.129
#apache有两台
[apache]
172.16.11.209
172.16.10.232
#nginx有一台
[nginx]
172.16.10.129 ansible_ssh_pass='csnginx123'
#定义密码
[apache:vars]
ansible_ssh_pass='123123'
[web_group:children]
apache
nginx
# 测试:ansible 主机名 -m 指定模块
[root@localhost ansible]# ansible web_group -m ping
172.16.11.209 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.10.232 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.10.129 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@localhost ansible]# ansible apache -m ping
172.16.11.209 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.10.232 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@localhost ansible]# ansible nginx -m ping
172.16.10.129 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
五、相关文章
Ansible自动化运维(一)介绍、安装部署-CSDN博客https://blog.csdn.net/lifeng4321/article/details/144146216?spm=1001.2014.3001.5501 |