Ansible安装与入门
目录
Ansible
ansible任务执行模式
ansible执行流程
ansible命令执行过程(背会)
ansible的安装方式
ansible的程序结构(yum安装为例)
ansible的配置文件查找顺序(背会)
核心配置文件
ansible的配置文件
Ansible常用命令
ansible-doc命令
部署ansible管理集群
实验环境
实验步骤
安装ansible
核心配置文件
添加主机清单
ansible的主机清单
免密设置
ansible配置公私钥
配置公私钥
copy一份公私钥给web主机
主机连通性测试
命令测试是否正常
Ansible常用模块
Ansible
ansible任务执行模式
-
ansible系统由控制主机被管节点的操作方式可以分为两类,即adhoc和playbook
-
ad-hoc模式(点对点模式)
使用单个模块,支持批量执行单条命令。ad-hoc命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell
-
playbook模式(剧本模式)
剧本模式是Ansible的主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task(任务)集合完成一类功能,比如web服务的安装部署、数据库服务的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件
ansible执行流程
-
简单理解就是Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回结果。
ansible命令执行过程(背会)
-
加载自己的配置文件,默认为/etc/ansible/ansible.cfg;
-
查找对应的主机配置文件,找到要执行的主机或者组;
-
加载自己对应的模块文件,如command;
-
通过ansible将模块或者命令生成对应的py文件(python脚本),并且将该文件传输到远程服务器;
-
对应执行用户的家目录.ansible/tmp/xxx/xxx.py文件;
-
给文件添加执行权限;
-
执行并且返回结果;
-
删除临时的py文件, sleep 0退出;
ansible的安装方式
使用yum安装
yum安装是我们比较熟悉的安装方式。我们需要先安装一个epel-release包,然后再安装ansible即可。
yum install epel-release -y
yum install ansible -y
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum install ansible -y
ansible的程序结构(yum安装为例)
-
配置文件目录:/etc/ansible/
-
执行文件目录:/usr/bin/
-
Lib库依赖目录:/usr/lib/pyhtonX.X/site-packages/ansible/
-
Help文档目录:/usr/share/doc/ansible-X.X.X/
-
Man文档目录:/usr/share/man/man1/
ansible的配置文件查找顺序(背会)
-
ansible与我们其他的服务在这一点上又很大的不同,这里的配置文件查找是从多个地方找的,顺序如下:
1.检查环境变量 ANSIBLE_CONFIG 指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible/ansible.cfg);
2. ~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件;
3./etc/ansible.cfg检查etc目录的配置文件。
核心配置文件
可用文件里命令生成一个
[root@localhost ~]# cd /etc/ansible/
[root@localhost ansible]# ls
ansible.cfg hosts roles
[root@localhost ansible]# vim ansible.cfg [root@localhost ansible]# ansible-config init --disabled -t all > ansible.cfg
[root@localhost ansible]# ansible-config init --disabled -t all > ansible.cfg
[root@localhost ansible]# vim ansible.cfg
ansible的配置文件
-
ansible的配置文件路径是/etc/ansible/ansible.cfg,ansible许多参数,下面我们列出一些常见的参数:
vim /etc/ansible/ansible.cfg
inventory = /etc/ansible/hoste #这个参数表示资源清单inventory文件的位置
library = /usr/share/ansible #指向存放ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就行。fbrks = 5 #并发连接数,默认为5
sudo_user = root #设置默认执行命令的用户 ,2.14版本中是:become_user=root
remote_port = 22 #指定连接被管理节点的端口,默认为22端口,为安全考虑,建议修改
host_key_checking = False #设置是否检查SSH主机的密钥,值为True/False,关闭后第一次连接不会提示配置实例
timeout = 60 #设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.cfg #指定一个存储ansible日志的文件(默认不记录日志)
[defaults]
inventory = /etc/ansible/hosts #主机清单文件路径。Ansible 通过此文件定义目标主机/组。
library = /usr/share/ansible/modules #Ansible 内置模块的搜索路径。若需加载自定义模块,可添加路径
modules_dir = /usr/share/ansible/modules #与 library 类似,但仅用于查找模块
remote_user = root #远程主机的登录用户。默认以 root 身份登录目标主机(生产环境建议改为普通用户,配合 become 提权)。
ask_pass = False ## 是否提示输入登录密码。若 remote_user 非免密登录,设为 True 会交互式询问密码(不安全,推荐用 SSH 密钥免密)。
private_key_file = None ##SSH 私钥文件路径。用于免密登录(如 private_key_file = ~/.ssh/id_rsa)。
remote_port = 22 ## 远程 SSH 端口。若目标主机 SSH 非默认端口(如 2222),需修改此值(remote_port = 2222)。
timeout=10 #SSH 连接超时时间(秒)。网络不稳定时可调大(如 timeout = 30)。
log_path=None #Ansible 操作日志路径。设为 /var/log/ansible.log 可记录详细执行日志(需确保文件可写)。
module_name = command #未指定模块时的默认模块。例如 ansible host -m shell 可省略 -m shell(不推荐,易混淆)。
executable= /bin/sh #命令执行的 Shell 解释器。若目标主机默认 Shell 非 /bin/sh(如 /bin/bash),可修改(executable = /bin/bash)
prompt= \# ##特权用户提示符匹配规则。用于判断是否已提权(如 prompt = \$ 可识别 $ 或 #)。
fact_caching=False #是否启用事实缓存(Facts Caching)。设为 True 可缓存主机信息(如 fact_caching = jsonfile,配合 fact_caching_connection 指定存储路径
fact_caching_timeout=86400 #事实缓存过期时间(秒)。默认 24 小时(86400 秒),可根据需求调整(如 fact_caching_timeout = 3600 缓存 1 小时)。
deprecation_warnings=True #是否显示已弃用警告。生产环境可设为 False 减少冗余输出(deprecation_warnings = False)。
display_skipped_hosts=True #是否显示跳过的主机。若任务因条件不满足跳过某些主机,设为 False 可隐藏这些主机的输出(display_skipped_hosts = False)。
host_key_checking=True #是否检查 SSH 主机密钥。首次连接新主机时会提示确认指纹,设为 False 可跳过(生产环境不建议,存在中间人攻击风险)。
inventory_ignore_extensions=['.pyc', '.pyo', '.swp', '.swo'] # 忽略的清单文件扩展名。避免误加载临时文件(如 inventory_ignore_extensions = ['.bak'])。
action_plugins=/usr/share/ansible/plugins/action # Action 插件搜索路径。自定义 Action 插件可添加至此(如 action_plugins = /opt/my_plugins/action)。
callback_plugins=/usr/share/ansible/plugins/callback #Callback 插件搜索路径。用于自定义输出格式(如集成 Jenkins、Slack 等)。
filter_plugins=/usr/share/ansible/plugins/filter # Filter 插件搜索路径。自定义变量过滤逻辑(如 filter_plugins = /opt/my_plugins/filter)
test_plugins= /usr/share/ansible/plugins/test # Test 插件搜索路径。用于测试变量或文件(如 test_plugins = /opt/my_plugins/test)
vars_plugins = /usr/sha
Ansible常用命令
[root@localhost ansible]# ls /usr/bin/| grep ansible
ansible
ansible-community
ansible-config
ansible-connection
ansible-console
ansible-doc
ansible-galaxy
ansible-inventory
ansible-playbook
ansible-pull
ansible-vault
#### ansible命令集解释* /usr/bin/ansible,Ansible AD-Hoc临时命令执行工具,常用于临时命令的执行
* /usr/bin/ansible-doc,Ansible模块功能查看工具(document)
* /usr/bin/ansible-galaxy,下载上传优秀的代码或者Roles模块的官网平台,基于网络的
* /usr/bin/ansible-playbook,Ansible定制自动化的任务集编排工具
* /usr/bin/ansible-pull,Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维架构能力要求高)
* /usr/bin/ansible-vault,Ansible文件加密工具
* /usr/bin/ansible-console,Ansible基于Linux Consoble界面可与用户交互的命令执行工具
ansible-doc命令
ansible-doc命令常用于获取模板块信息及其适用帮助,一般用法如下:
ansible-doc -l ##获取全部模块信息
ansible-doc -s MOD_NAME #获取指定模块的使用帮助
部署ansible管理集群
全程是只需要,在ansible上面操作就行!!!
实验环境
主机名 IP地址 安装包 ansible 192.168.158.164 epel-release、ansible node1 192.168.158.159 - node2 192.168.158.160 -
实验步骤
安装ansible
[root@localhost ~]# hostnamectl set-hostname ansible
[root@localhost ~]# su
[root@ansible ~]# yum install epel-release -y
[root@ansible ~]# yum install ansible -y
核心配置文件
可用文件里命令生成一个
[root@localhost ~]# cd /etc/ansible/
[root@localhost ansible]# ls
ansible.cfg hosts roles
[root@localhost ansible]# vim ansible.cfg [root@localhost ansible]# ansible-config init --disabled -t all > ansible.cfg
添加主机清单
[root@ansible ~]# cd /etc/ansible/
[root@ansible ansible]# ls
ansible.cfg hosts roles
[root@ansible ansible]# vi hosts [web] ##添加到最后一行
192.168.158.159
192.168.158.160
ansible的主机清单
-
在配置文件中,我们提到了资源清单,这个清单就是主机清单,里面保存的是一些ansible需要连接管理的主机列表。
-
如下是ansible主机清单的定义方式:
-
vim /etc/ansible/hosts
(直接在末尾添加)
例如:
1.直接指明主机地址或者主机名: #green.example.com# #bule.example.com# # 192.168.115.101 # 192.168.115.1022.定义一个主机组(组名)把地址或者主机名加进去 [mysql_test] 192.168.115.101 192.168.115.102 192.168.115.103
-
需要注意的是,这里的组成员可以使用通配符来匹配,这样对于一些标准化管理就比较方便。我们可以根据实际情况来配置我们的主机列表,具体的操作如下:
vi /etc/ansible/hosts #定义一组web主机组[web] 192.168.158.159 192.168.158.160
免密设置
ansible配置公私钥
配置公私钥
copy一份公私钥给web主机
[root@localhost ansible]# ssh-keygen -N '' -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
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:/fwy5SFyKfwKf61esKQk57v7ok2gruFMyf1tncudYKA root@localhost.localdomain
The key's randomart image is:
+---[RSA 3072]----+
| |
| |
| |
| . |
| S.= o. |
| . o . B+*+oo |
| = o E +***.. |
| + o . *o+B=o. |
| +.. ooOO*=+ |
+----[SHA256]-----+
[root@localhost ansible]# ssh-copy-id 192.168.158.159
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.158.159 (192.168.158.159)' can't be established.
ED25519 key fingerprint is SHA256:T18Ri2Kqfht/W/As6DBvSPOqvDBUhgWq5aORE9E4CPQ.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/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@192.168.158.159's password: Number of key(s) added: 1Now try logging into the machine, with: "ssh '192.168.158.159'"
and check to make sure that only the key(s) you wanted were added.[root@localhost ansible]# ssh-copy-id 192.168.158.160
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.158.160 (192.168.158.160)' can't be established.
ED25519 key fingerprint is SHA256:T18Ri2Kqfht/W/As6DBvSPOqvDBUhgWq5aORE9E4CPQ.
This host key is known by the following other names/addresses:~/.ssh/known_hosts:1: 192.168.158.159
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/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@192.168.158.160's password: Number of key(s) added: 1Now try logging into the machine, with: "ssh '192.168.158.160'"
and check to make sure that only the key(s) you wanted were added.
主机连通性测试
命令测试是否正常
[root@localhost ansible]# ansible 192.168.158.159 -m ping
192.168.158.159 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong"
}
[root@localhost ansible]# ansible 192.168.158.160 -m ping
192.168.158.160 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong"
}
Ansible常用模块
-
- **
command
&shell
:** (执行命令)- 作用: 让你的“小机器人”在被管服务器上运行命令。就像你打开服务器的命令行窗口输入指令一样。
- 区别:
command
:只运行简单命令,不支持管道符(|
)、重定向(>
<
)、环境变量($HOME
)这些复杂操作。shell
:可以运行任何你在命令行能运行的复杂命令,支持管道、重定向、变量。 注意: 能用command
就用command
,更安全、结果更稳定;实在需要复杂操作再用shell
。
- **
copy
&fetch
: (文件传输) - 方向相反!**- **
copy
: 作用是把你本地的文件或者Playbook目录下的文件**,复制到被管服务器上。就像你让管家把你电脑里的文件A拿到服务器B上去放好。 - **
fetch
: 作用是从被管服务器上把文件拉取(下载)到你运行Playbook的电脑**(控制节点)。就像你让管家去服务器B上把某个重要的日志文件C拿回来给你看。
- **
- **
file
:** (文件/目录管理)- 作用: 操作文件和目录本身(不是内容)。让管家去创建文件、目录、设置权限(读、写、执行)、更改所有者、创建软链接/硬链接等。比如:在服务器上创建目录
/data
,权限设为755
,所有者是www-data
。
- 作用: 操作文件和目录本身(不是内容)。让管家去创建文件、目录、设置权限(读、写、执行)、更改所有者、创建软链接/硬链接等。比如:在服务器上创建目录
- **
fetch
:** (上面已介绍) - **
cron
:** (定时任务)- 作用: 让管家在服务器上设置(添加、修改、删除)定时任务(cron job)。就像配置“服务器上的闹钟”,让它定期执行某个命令或脚本(比如每天凌晨备份数据库)。
- **
yum
(CentOS/RHEL) /apt
(Ubuntu/Debian): (软件包管理) - 图片是yum
,注意你的系统!**- 作用: 让管家在服务器上安装、更新、卸载、查看软件包。就像用手机上的“应用商店”装/卸载APP一样。
- **
service
:** (服务管理)- 作用: 让管家启动、停止、重启、重新加载、查看系统服务的状态。比如启动Nginx网站服务(
nginx
)、停止MySQL数据库服务(mysqld
)。
- 作用: 让管家启动、停止、重启、重新加载、查看系统服务的状态。比如启动Nginx网站服务(
- **
user
&group
:** (用户/组管理)- 作用:
user
:让管家创建、修改、删除用户账号,设置密码、家目录、Shell、所属组等。group
:让管家创建、修改、删除用户组,管理组成员。
- 作用:
- **
script
:** (运行脚本)- 作用: 让管家把你写在本地的Shell脚本、Python脚本等复制到被管服务器上去执行。比如你写了一个
backup.sh
的备份脚本,用这个模块传到服务器上并运行它。
- 作用: 让管家把你写在本地的Shell脚本、Python脚本等复制到被管服务器上去执行。比如你写了一个
- **
setup
(或gather_facts
):** (收集信息)- 作用: Ansible管家在执行任何任务前,会自动收集被管服务器的各种信息(主机名、IP地址、操作系统版本、内存大小、磁盘空间等)。你可以在任务中直接使用这些信息(称为
facts
),实现更智能的自动化(比如根据内存大小设置不同的软件参数)。这个模块就是负责收集这些信息的,默认会自动运行。
- 作用: Ansible管家在执行任何任务前,会自动收集被管服务器的各种信息(主机名、IP地址、操作系统版本、内存大小、磁盘空间等)。你可以在任务中直接使用这些信息(称为
- **