自动化运维之Ansible
1 自动化运维
1.1 背景
当管理的服务器很多时,假设有1000台,如果想要在1000台服务器上做一个简单的操作:
1.按照传统方法,一台连着一台服务器的ssh登录,然后手动操作,效率太低:
- 重复操作频繁,增加了人工成本和后续维护成本
- 机器太多时,容易落下某些机器且未操作,进而产生后续影响
- 人工频繁操作时可能有操作步骤不完整的情况,造成该机器和其他机器状态不一致
2.若写脚本实现,会有以下缺点:
- 管理的机器平台不一致,脚本可能不具备通用性
- 传密码麻烦(在非免密登录的环境下, 需要expect来传密码)
- 效率较低,循环1000次也需要一个一个的完成,如果用`&`符放到后台执行,则会产生1000个进程
2.2 运维的未来是什么?
一切皆自动化
“运维的未来是,让研发人员能够借助工具、自动化和流程,并且让他们能够在运维干预极少的情况下部署和运营服务,从而实现自助服务。每个角色都应该努力使工作实现自动化。”——《运维的未来》
2.3 自动化运维概述
自动化运维:将日常IT运维中大量的重复性工作,小到简单的日常检查、配置变更和软件安装,大到整个变更流程的组织调度,由过去的手工执行转为自动化操作,从而减少乃至消除运维中的延迟,实现“零延时”的IT运维。好处:
- 减少了重复操作,提高了工作效率;
- 减小了出错几率,提高了准确率;
- 所有机器状态一致,降低了后续维护成本。
相关工具:
代码管理(SCM):GitHub、GitLab、BitBucket、SubVersion
构建工具:maven、Ant、Gradle
自动部署:Capistrano、CodeDeploy
持续集成(CI):master、Travis
配置管理:Ansible、SaltStack、Chef、Puppet
容器:Docker、Podman、LXC、第三方厂商如AWS
编排:Kubernetes、Core、Apache Mesos
服务注册与发现:Zookeeper、etcd、Consul
脚本语言:python、ruby、shell
日志管理:ELK、Logentries
系统监控:Prometheus、Zabbix、Datadog、Graphite、Ganglia、Nagios
性能监控:AppDynamics、New Relic、Splunk
压力测试:JMeter、Blaze Meter、loader.io
应用服务器:Tomcat、JBoss、IISWeb
服务器:Apache、Nginx
数据库:MySQL、Oracle、PostgreSQL等关系型数据库;mongoDB、redis等NoSQL数据库
项目管理(PM):Jira、Asana、Taiga、Trello、Basecamp、Pivotal Tracker
2.4 常用自动化运维工具
puppet
基于ruby语言,成熟稳定。适合于大型架构,相对于ansible和saltstack会复杂些。
saltstack
基于python语言,相对简单,大并发能力比ansible要好,但需要维护被管理端的服务。如果服务断开,连接就会出问题。
ansible
基于python语言,简单快捷,被管理端不需要启服务。直接走ssh协议,需要验证,所以机器多的话速度会较慢。
3 Ansible
ansible官网:https://www.ansible.com/
ansible官方文档:https://docs.ansible.com/
3.1 Ansible简介
ansible是基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。进而能减少我们的重复操作,提高工作效率。
Ansible 不需要在远程主机上安装 client/agents,因为它们是基于 SSH 来和远程主机通讯的。
Ansible 目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
3.2 Ansible功能
-
批量执行远程命令:可以对远程的多台主机同时进行命令的执行。
-
批量安装和配置软件服务:可以对远程的多台主机进行自动化的方式配置和管理各种服务。
-
提供自动化运维工具的开发API,有很多运维工具:如jumpserver就是基于 ansible 实现自动化管理功能。
-
编排高级的企业级复杂的IT架构任务:Ansible的Playbook和role可以轻松实现大型的IT复杂架构。
3.3 Ansible特性
- 部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作
- 安全可靠,默认使用 SSH 协议对被控端进行管理
- 有大量的常规运维操作模块,可实现日常绝大部分操作
- 配置简单、功能强大、扩展性强
- 支持 API 及自定义模块,可通过 Python 轻松扩展
- 通过 Playbooks 来定制强大的配置、状态管理
- 轻量级,无需在客户端安装 Agent,更新时只需在操作机上进行一次更新即可
- 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对
3.4 Ansible架构
ansible基础架构:
- Ansible:主程序。
- Core Modules: 预定义模块。
- Custom Modules: 核心模块功能不足时,用户添加的扩展模块。
- Plugins: 通过插件来实现记录日志,发送邮件或其他功能。
- Playbooks: 剧本,YAML格式剧本文件,多个任务定义在一个文件中,定义受控端批量调用的模块。
- Connectior Plugins: 负责和被监控端实现通信,ansible基于连接插件连接到各个主机上,默认是使用ssh协议
- Host Inventory: 指定操作的主机,是一个配置文件里面定义监控的主机,记录由Ansible管理的主机信息,包括端口、密码、ip等
3.5 Ansible工作原理
Ansible:组合 INVENTORY、API、MODULES、PLUGINS 的绿框,可以理解为是 ansible 命令工具,其 为核心执行工具。
Ansible 主要组成部分:
-
ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
-
INVENTORY:Ansible管理主机的清单,配置文件:/etc/anaible/hosts
-
MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
-
PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
-
API:供第三方程序调用的应用程序编程接口
3.5.1 Ansible任务执行模式
Ansible 控制主机对被管节点的操作方式可分为两类,即 ad-hoc 和 playbook:
ad-hoc 模式(点对点模式)
ad-hoc 模式使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于 bash 中的一句 shell。
playbook 模式(剧本模式)
playbook 模式是 Ansible 主要管理方式,也是 Ansible 功能强大的关键所在。playbook 通过多个 tasks 集合完成一类功能,如 Web 服务的安装部署、数据库服务器的批量备份等。可以简单地把 playbook 理解为通过组合多条 ad-hoc 操作的配置文件。
3.5.2 Ansible执行流程
简单理解就是:Ansible 在运行时,首先读取ansible.cfg中的配置,根据规则获取 Inventory 中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回的结果。
Ansible 命令执行来源
- USER,普通用户,即 SYSTEM ADMINISTRATOR
- CMDB(配置管理数据库) API 调用
- PUBLIC/PRIVATE CLOUD API 调用 (公有私有云的 API 接口调用)
- USER-> Ansible Playbook -> Ansibile
Ansible 命令执行过程
- 加载自己的配置文件,默认/etc/ansible/ansible.cfg
- 加载自己对应的模块文件,如command,或者ping等
- 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
- 给文件+x执行
- 执行并返回结果
- 删除临时py文件,退出
3.5.3 Ansible执行状态
- 绿色:执行成功并且不需要做改变的操作
- 黄色:执行成功并且对目标主机做变更
- 红色:执行失败
- 粉色:警告信息
- 蓝色:显示ansible命令执行的过程
[appop@master ~]$ grep -A 14 '\[colors\]' /etc/ansible/ansible.cfg
[colors]
#highlight = white
#verbose = blue
#warn = bright purple
#error = red
#debug = dark gray
#deprecate = purple
#skip = cyan
#unreachable = red
#ok = green
#changed = yellow
#diff_add = green
#diff_remove = red
#diff_lines = cyan
3.6 Ansible安装
3.6.1 Ansible部署拓扑图
Ansible中控机模式部署拓扑图:
3.6.2 Ansible安装需求
-
执行 ansible 的主机一般称为主控端,中控,master或堡垒机。
-
主控端 Python 版本需要 2.6 或以上, windows 不可以做主控端。
-
被控端 Python 版本低于 2.5,需要额外安装一个模块:
python-simplejson
。
注意事项:
- 自2.0版本开始,ansible使用了更多句柄来管理它的子进程,对于OS X系统,你需要增加ulimit值才能使用15个以上子进程,方法 sudo launchctl limit maxfiles 1024 2048,否则你可能会看见”Too many open file”的错误提示。
- 通常我们使用 ssh 与托管节点通信,默认使用 sftp。如果 sftp 不可用,可在 ansible.cfg 配置文件中配置成 scp 的方式。
- ansible 不是服务,不会一直启动,只是需要的时候启动。
3.6.3 Ansible基本环境
主机规划
主机名称 | 操作系统版本 | 内网IP | 安装软件 |
---|---|---|---|
master | Centons 7.9 | 192.168.3.3 | Python3、Ansible 、OpenSSH |
node01 | Centons 7.9 | 192.168.3.6 | Python3、OpenSSH |
node02 | Centons 7.9 | 192.168.3.8 | Python3、OpenSSH |
node03 | Centons 7.9 | 192.168.3.10 | Python3、OpenSSH |
静态ip地址设置
# 在CentOS 7上配置静态ip
1.以root用户登录,修改网络配置
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="static" #是否自动获取,static是静态地址
ONBOOT=yes #开机加载
IPADDR="192.168.3.3"
NETMASK="255.255.255.0"
GATEWAY="192.168.3.1"
2.重启网卡,使静态ip的配置文件生效
[root@localhost ~]# service network restart
3.配置 DNS
[root@localhost ~]# vi /etc/resolv.conf
nameserver 192.168.3.1
nameserver 114.114.114.114
nameserver 8.8.8.8
注:若克隆的Linux虚拟机,则通过“编辑虚拟机设置 -> 网络适配器 -> 高级”重新生成克隆的机器MAC地址。
主机名修改,关闭防火墙、selinux
1.主机名修改
[root@localhost ~]# vi /etc/hosts
192.168.3.3 master
2.关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
3.关闭selinux
[root@localhost ~]# vi /etc/selinux/config
将SELINUX=enforcing指令更改为SELINUX=disabled
检查系统上 SELinux 的状态:sestatus
4.重启Linux
[root@master ~]# shutdown -r now
用户及用户组创建
在Linux系统下创建appop用户及appop组;使用root用户登录,执行以下命令:
# 创建appop组
[root@master ~]# groupadd appop
# 创建appop用户
[root@master ~]# useradd appop -g appop
# 设置appop用户密码
[root@master ~]# passwd appop
更改用户 appop 的密码 。
新的 密码:
问题描述:普通用户输入一些系统命令后出现:不在sudoers文件中,此事将被报告。这是因为当前操作用户的权限不够。
[appop@master ~]$ sudo su -
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] appop 的密码:
appop 不在 sudoers 文件中。此事将被报告。
问题解决:
1.输入命令“ll -h /etc/sudoers”,查看/etc/sudoers文件权限,如果只读权限,修改为可写权限。
[root@master ~]# ll -h /etc/sudoers
-r--r-----. 1 root root 4.3K 9月 30 2020 /etc/sudoers
2.输入修改权限命令:"chmod u+w /etc/sudoers"
[root@master ~]# chmod u+w /etc/sudoers
[root@master ~]# ll -h /etc/sudoers
-rw-r-----. 1 root root 4.3K 9月 30 2020 /etc/sudoers
3.输入编辑命令“vi /etc/sudoers”,在文件中找到root ALL=(ALL) ALL这一行,在该行下以同样的参数添加提升权限的用户信息。
[root@master ~]# vi /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
appop ALL=(ALL) ALL
4.返回到命令页面,输入回复权限的命令:
[root@master ~]# chmod 440 /etc/sudoers
5.输入命令:"sudo su -",切换到root用户。
[appop@master ~]$ sudo su -
[sudo] appop 的密码:
上一次登录:三 8月 17 12:43:43 CST 2022从 192.168.3.173pts/1 上
[root@master ~]#
输入系统操作命令,发现普通用户已有了权限提升,问题解决。
使用ntp同步标准时间
使用date命令,查看系统时间和当前时间是否一致,如果不一致,就需要使用ntp同步标准时间,ntp:网络时间协议(network time protol)。
1.安装:sudo yum install -y ntp
2.同步:sudo ntpdate pool.ntp.org
Python2升级到Python3
1.查看当前python的版本信息
[appop@master ~]$ ll /usr/bin/python*
lrwxrwxrwx. 1 root root 7 8月 24 10:47 /usr/bin/python -> python2
lrwxrwxrwx. 1 root root 9 8月 24 10:47 /usr/bin/python2 -> python2.7
-rwxr-xr-x. 1 root root 7144 6月 28 23:30 /usr/bin/python2.7
2.安装依赖
[appop@master ~]$ sudo yum install gcc gcc-c++ libffi-devel python-setuptools vim wget make sqlite-devel zlib* bzip2-devel openssl-devel ncurses-devel readline-devel tk-devel -y
3.到官网查看最新的版本,并进行python下载:
官网下载:https://www.python.org/ftp/python
4.下载完成后,将Python-3.9.6.tar.xz传至所在服务器/home/appop目录下
[appop@master ~]$ cd /home/appop
5.解压python安装包
[appop@master ~]$ tar -xvf Python-3.9.6.tar.xz
6.进入到解压后的目录,运行配置>>编译>>安装
[appop@master ~]$ cd Python-3.9.6
[appop@master Python-3.9.6]$ ./configure --with-ssl
# 注意:执行./configure时,一定要加上--with-ssl,不然后面pip3下载包就麻烦了
[appop@master Python-3.9.6]$ make
[appop@master Python-3.9.6]$ sudo make install
Installing collected packages: setuptools, pip
WARNING: The scripts pip3 and pip3.9 are installed in '/usr/local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
大概意思是,提示我们安装的脚本不在路径中,下面创建链接。
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
root用户执行pip3命令时提示警告,可执行时带上--user参数:pip3 install --user packagename。
我们使用服务器,很多时候并没有root权限,也无法用sudo,所以安装的时候都要加上 --user参数,安装就在/home目录下,而不是在/user目录下。
7.设置默认版本
# 将原来 python 的软链接重命名:
[appop@master Python-3.9.6]$ sudo mv /usr/bin/python /usr/bin/python.bak
# 将 python 链接至 python3:
[appop@master Python-3.9.6]$ sudo ln -s /usr/local/bin/python3 /usr/bin/python
8.yum配置
[appop@master Python-3.9.6]$ sudo yum list
SyntaxError: invalid syntax
File "/usr/libexec/urlgrabber-ext-down", line 28
except OSError, e:
^
升级 Python 之后,由于将默认的 python 指向了 python3,yum 不能正常使用,需要编辑 yum 的配置文件,此时,需要修改/usr/bin/yum和/usr/libexec/urlgrabber-ext-down配置,将 #!/usr/bin/python 改为 #!/usr/bin/python2,保存退出即可。
9.升级pip
[appop@master Python-3.9.6]$ python3.9 -m pip install --upgrade pip
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pip in /home/appop/.local/lib/python3.9/site-packages (22.2.2)
10.查看当前python的默认版本
[appop@master bin]$ python -V
Python 3.9.6
11.查看pip版本
[appop@master Python-3.9.6]$ pip3 -V
pip 22.2.2 from /home/appop/.local/lib/python3.9/site-packages/pip (python 3.9)
12.参考链接
Python2升级到Python3 https://www.cnblogs.com/nuccch/p/15153978.html
3.6.4 Ansible安装方式
ansible官方文档:https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
3.6.4.1 rpm包安装
1.安装epel源,安装好之后安装ansible
[appop@master ~]$ sudo yum install -y epel-release
2.使用CentOS的EPEL源的rpm包安装
[appop@master ~]$ sudo yum -y install ansible
3.查看ansible版本
[appop@master ~]$ yum info ansible
3.6.4.2 编译安装
1.安装ansible相关的依赖包
[appop@master ~]$ sudo yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
2.到官网查看最新的版本,并进行ansible下载:
ansible官网下载:https://releases.ansible.com/ansible/
pip官网下载:https://pypi.org/project/ansible/
3.下载ansible,并将ansible-2.9.27.tar.gz传至所在服务器/home/appop目录下
[appop@master ~]$ cd /home/appop
4.解压ansible安装包
[appop@master ~]$ tar -zxxf ansible-2.9.9.tar.gz
5.进入到解压后的目录,运行setup.py 编译并安装
[appop@master ~]$ cd ansible-2.9.9
[appop@master ansible-2.9.9]$ sudo python setup.py build
[appop@master ansible-2.9.9]$ sudo python setup.py install
错误:[Errno 13] Permission denied: '/usr/local/lib/python3.9/site-packages/test-easy-install-63582.write-test'
解决:该错误是提示要用root权限,可以用sudo表示用root权限执行,在命令前面加sudo命令。
6.拷贝配置文件
[appop@master ansible-2.9.9]$ sudo mkdir -p /etc/ansible
[appop@master ansible-2.9.9]$ sudo cp -r examples/* /etc/ansible
7.确认安装
[appop@master ~]$ ansible --version
3.6.4.3 Git方式安装
1.安装与python版本匹配的包管理工具pip
[appop@master ~]$ sudo easy_install pip
2.在Git仓库下载ansible
[appop@master ~]$ git clone https://gitee.com/mirrors/ansible.git --recursive
3.源码安装ansible
[appop@master ~]$ cd ./ansible
[appop@master ~]$ source ./hacking/env-setup
如果要抑制虚假警告/错误,可使用:source ./hacking/env-setup -q
4.安装Python模块
[appop@master ~]$ pip install --user paramiko PyYAML Jinja2 httplib2
5.确认安装
[appop@master ~]$ ansible --version
注意:当更新ansible版本时,不只要更新git的源码树,也要更新git中指向Ansible自身模块的“submodules”(不是同一种模块)
[appop@master ~]$ git pull --rebase
当前分支 devel 是最新的。
[appop@master ~]$ git submodule update --init --recursive
3.6.4.4 pip安装
pip 是安装 Python 包的管理器,类似 yum
1.使用pip安装ansible
[appop@master ~]$ pip3 install --user ansible --upgrade
2.确认安装
[appop@master ~]$ ansible --version
3.6.5 配置免密登录认证
ansible 相关工具大多数是通过ssh协议,实现对远程主机的配置管理、应用部署、任务执行等功能。
实现基于 key 验证 将公钥 ssh-copy-id 到被管理的主机上 , 实现免密登录 。
建议:使用此工具前,先配置ansible主控端能基于密钥认证的方式联系各个被管理节点。
1.在主控端上,修改/etc/ssh/ssh_config配置:将StrictHostKeyChecking由ask改成no,并将注释取消
[root@master ~]# vi /etc/ssh/ssh_config
StrictHostKeyChecking no
2.在被控端上,修改/etc/ssh/sshd_config配置:
将GSSAPIAuthentication由yes改成no
将UseDNS由yes改成no,并将注释取消
[root@master ~]# vi /etc/ssh/sshd_config
GSSAPIAuthentication no
UseDNS no
[root@master ~]# service sshd restart
3.在主控端上,生成密钥
[appop@master ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/appop/.ssh/id_rsa):
Created directory '/home/appop/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/appop/.ssh/id_rsa.
Your public key has been saved in /home/appop/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:q0zM5h28tf1qv4A885COWKMTcu21Ls6qVJLaXBY86yY appop@master
The key's randomart image is:
+---[RSA 2048]----+
| |
| . |
| + |
| . + |
| o =.S |
| +.Oo..o.o |
| . EoBo*.O.. |
| . B.BoB.B.. |
| ..B+*o+.+++. |
+----[SHA256]-----+
4.在主控端上,将密钥发送到目标主机
[appop@master ~]$ ssh-copy-id 192.168.3.6
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/appop/.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
appop@192.168.3.6's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.3.6'"
and check to make sure that only the key(s) you wanted were added.
5.测试连接
[appop@master ~]$ ansible -m ping all
192.168.3.8 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.3.10 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.3.6 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
3.7Ansible相关文件
3.7.1 Ansible目录结构
ansible.cfg:主配置文件,配置 ansible 工作特性(一般无需修改)
hosts:主机清单(将被管理的主机放到此文件)
roles目录:创建角色和目录,其子目录包括:
defaults(默认变量目录)
handlers(处理程序,notify调用部分playbook)
meta(角色依赖关系处理)
tasks(具体执行的任务操作目录,存放playbook)
templates(模板文件目录)
vars(roles内的变量文件目录)
files(存放安装包和文件目录)
例:创建nginx,mysql,php,zabbix的目录结构
[appop@master ~]$ mkdir -p /etc/ansible/roles/{
nginx,mysql,php,zabbix}/{
defaults,files,handlers,meta,tasks,templates,vars}
3.7.2 Ansible主配置文件
ansible 的配置文件可以放在多个不同地方,优先级从高到低顺序如下:
# 环境变量
ANSIBLE_CONFIG
# 当前目录下的ansible.cfg
./ansible.cfg
# 当前用户家目录下的.ansible.cfg
~/.ansible.cfg
# 系统默认配置文件
/etc/ansible/ansible.cfg
ansible 的默认配置文件 /etc/ansible/ansible.cfg,一般保持默认,无需进行修改。
[appop@master ~]$ sudo vi /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp #本机的临时命令执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo 用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass = True #每次执行ansible命令是否询问ssh口令
#remote_port = 22 #远程主机的端口号(默认22)
建议优化项:
#host_key_checking = False #检查对应服务器的host_key,建议取消此行注释,实现第一次连接自动信任目标主机
#log_path=/var/log/ansible.log #日志文件,建议启用
#module_name = command #默认模块,可以修改为shell模块
3.7.3 主机清单 inventory
-
ansible 的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在 inventory file中将其分组命名
-
默认的 inventory file 为/etc/ansible/hosts
-
nventory file 可以有多个,且也可以通过 Dynamic Inventory 来动态生成
注意: 生产建议在每个项目目录下创建项目独立的hosts文件
3.7.3.1 主机清单文件格式
/etc/ansible/hosts 文件格式:
inventory 文件遵循 INI 文件风格,中括号中的字符为组名。
可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的 SSH 端口,还可以在主机名称之后使用冒号加端口号来标明。
# 范例:
ntp.magedu.com 不分组,直接加
[webservers] webservers组
www1.magedu.com:2222 可以指定端口
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
[test]
10.0.0.8 ansible_connection=local #指定本地连接,无需ssh配置
#ansible_connection=ssh 需要StrictHostKeyChecking no
10.0.0.7 ansible_connection=ssh ansible_ssh_port=2222 ansible_ssh_user=appop ansible_ssh_password=magedu
10.0.0.6 ansible_connection=ssh ansible_ssh_user=root ansible_ssh_password=123456
#执行ansible命令时显示别名,如web01
[websrvs]
web01 ansible_ssh_host=10.0.0.101
web02 ansible_ssh_host=10.0.0.102
[websrvs:vars]
ansible_ssh_password=magedu
some_host ansible_ssh_port=2222 ansible_ssh_user=manager
aws_host ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
freebsd_host ansible_python_interpreter=/usr/local/bin/python
ruby_module_host ansible_ruby_interpreter=/usr/bin/ruby.1.9.3
如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机。
# 范例: 组嵌套