Ansible的使用背景
当测试环境只有1-2台主机时,我们要完成一个版本包的部署或者提取一个日志是非常之容易的事情,但是随着项目进度的进行,动辄上千台甚至上百台主机的话,我们一台一台的执行命令显然是不现实的,这个时候便引入我们的主角:ansible
——2023年12月12日更新
安装报错解决方案
问题1:Error: Failed to download metadata for repo 'base': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried
CentOS-8 - Base - mirrors.aliyun.com 45 B/s | 2.3 kB 00:51
Errors during downloading metadata for repository 'base':
- Curl error (6): Couldn't resolve host name for http://mirrors.cloud.aliyuncs.com/centos/8/os/x86_64/repodata/repomd.xml [Could not resolve host: mirrors.cloud.aliyuncs.com]
- Curl error (28): Timeout was reached for http://mirrors.aliyuncs.com/centos/8/os/x86_64/repodata/repomd.xml [Connection timed out after 30001 milliseconds]
- Status code: 404 for http://mirrors.aliyun.com/centos/8/os/x86_64/repodata/repomd.xml (IP: 124.165.216.219)
Error: Failed to download metadata for repo 'base': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried
解决办法:CentOS更改yum源与更新系统
第一步:查看系统信息
cat /etc/redhat-release
第二步:根据你的系统版本号,例如centos7还是centos8还是centos 21.10LTS_SP2等,根据下面的信息进行调整配置,确保你已经安装了wget
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
问题2:"msg": "Failed to connect to the host via ssh: ssh: connect to host 10.10.100.00 port 22: Connection refused\r\n",
解决办法:更改配置文件中的端口(如下文的host_local中添加ansible_port=223即修改为你主机实际的端口号即可)
Ansible是什么
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的,并且上手容易,学习简单。
Ansible程序结构及配置
安装目录如下(yum安装):
-
配置文件目录:/etc/ansible/ (/etc:所有的系统管理所需要的配置文件和子目录)
-
执行文件目录:/usr/bin/ (/usr:存放应用程序和目录;/bin:是binary的缩写,这个目录存放着最经常使用的命令)
-
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/ (/lib:系统开机所需要最基本的动态连接共享库)
其他配置项如下:
ansible的默认配置文件路径为 /etc/ansible,一般不会使用这些默认文件,我们可以根据需要在本地目录中创建配置文件:例如host_local
cat host_local
[web] #用[]代表一个主机组
10.xxx.xxx.111
10.xxx.xxx.112
[all:vars]
ansible_ssh_user="" #输入你各主机的用户名
ansible_ssh_pass="" #输入你各主机的密码
Ansible的执行
Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回的结果。
Ansible的命令具体格式:
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
-i inventory #指定主机清单的路径,默认为/etc/ansible/hosts,上面举例host_local即你想要批量的执行脚本或者命令,总得要有要执行的主机列表吧
-f forks #并行任务数,默认为5
-m module_name #执行模块的名字,默认使用 command 模块即你想要批量执行脚本或者命令,现在已经知道了主机列表,总得进一步了解你需要做什么吧
-a args #模块的参数,如果执行默认command的模块,即是命令参数,如:“ls”,“pwd”等等
主机联通性测试:
$ ansible -i host_local web -m ping|head
10.xxx.xxx.111| SUCCESS => {
"changed": false,
"ping": "pong"
}
10.xxx.xxx.112| SUCCESS => {
"changed": false,
"ping": "pong"
}
#以上结果代表着我们可以正常连接远程主机,接下来的操作才可以正常进行
shell模块
shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道只要是我们的shell命令,都可以通过这个模块在远程主机上运行
ansible -i host_local 10.xxx.xxx.111 -m shell -a "ps -ef |grep abc.sh"
Copy模块
copy模块可以将本地文件复制到远程主机(并指定权限)
ansible -i host_local all -m copy -a "src=./adc.tar.gz dest=/xxx/xxx/tower.tar.gz mode=0755"
src #被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径;
dest #必选项,将源文件复制到的远程主机的绝对路径。
file模块
模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等。directory:如果目录不存在,就创建目录;absent:删除目录、文件或者取消链接文件。
ansible -i host_local all -m file -a 'path=/log/web state=directory'
fetch模块
fetch模块用于从远程某主机获取(复制)文件到本地
ansible -i host_local 10.xxx.xxx.111 -m fetch -a "src=./log/web/tower.log dest=/home/adc/ flat=yes"
src:在远程拉取的文件,可以是一个file或目录
dest:用来存放文件的目录
flat:参数用于指定是否将文件复制到指定目录下的根目录中
(默认情况下,当您使用 Fetch 模块时,Ansible 将文件复制到指定目录中的子目录中,该子目录的名称基于远程主机上文件的完整路径。例如./log/web/tower.log文件从远程复制到本地的家目录中将默认复制到home/log/web/中。如在使用 Fetch 模块时将 flat=yes 参数设置为 yes,则将文件复制到指定目录的根目录下,而不是使用子目录。这意味着文件名将保持不变,并且将被复制到指定的目录中)
另外fetch模块执行时需要远程主机有读取权限且文件(目录)真实存在,同时本地主机需要有写入权限。
service模块
service模块用于服务程序的管理
ansible -i host_local web -m service -a 'name=nginx state=started enabled=true'
name #服务名称;enabled #设置开机启动
state #有四种状态,分别为:started--->启动服务, stopped--->停止服务, restarted--->重启服务, reloaded--->重载配置
script模块
script模块用于将本机的脚本在远程主机上运行,该模块直接指定脚本的路径即可。script 模块将脚本文件复制到远程主机上的一个临时目录中,然后在远程主机上执行该脚本。因此,如果使用脚本模块运行的任何脚本需要其他文件或资源,则必须确保这些文件或资源也被复制到远程主机上。
ansible -i host_local web -m script -a '/tmp/cp.sh'