centos下安装ansible自动化工具(超详细,包含基本使用)
ansible官网:https://www.ansible.com
众所周知,ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能,它还提供通过编写playbook实现批量部署等功能。
原理图如下:
ansible核心模块介绍:
core models: ansible自带的模块,file,shell,copy等
custom models: ansible自带模块不足以满足工作需要时,用户添加扩展模块
host inventory: 由ansible 管理的主机,包括主机名,ip,端口等
playbook: yaml格式文件,多任务定义在一个yaml文件中,主要定义哪些功能由哪些模块完成,顺序执行
connection plugins: ansible通过该插件连接到各个目标主机,内部默认使用paramiko模块ssh协议来完成
那么下面开始安装ansible:
1 Ansible 安装(两种方式)
(1)EPEL源的rpm包安装(首先需要安装epel源)
yum install -y epel-release
yum install ansible
(2) pip 安装
pip 是安装Python包的管理器,类似 yum
yum install python3-pip python-devel
yum install gcc glibc-devel zlib-devel rpm-bulid openssl-devel
pip3 install --upgrade pip
pip3 install ansible --upgrade
2 确认安装
ansible --version #查看ansible安装参数和版本
ansible 2.9.5
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules',
'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Nov 21 2019, 19:31:34) [GCC 8.3.1 20190507
(Red Hat 8.3.1-4)]
3 安装完成后传输ssh密钥给其他远程主机
ssh-keygen #获取ssh传输key
ssh-copy-id 192.168.149.10 #传输key到指定主机(这里有哪些使用ansible的主机就传输给哪些主机)
ssh-copy-id 192.168.149.11
ssh-copy-id 192.168.149.12
4 修改ansible配置文件(以下为各配置文件位置)
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录
(1)ansible主配置文件(其中大部分内容无需进行修改)
/etc/ansible/ansible.cfg #ansible主配置文件
[defaults]
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
remote_port = 22
host_key_checking = False # 检查对应服务器的host_key,建议取消注释
log_path=/var/log/ansible.log #日志文件,建议启用
module_name = command #默认模块,可以修改为shell
(2)inventory 主机清单
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在hosts中将其分组命名
主机清单文件格式(我将149.10、149.11主机放在了one组,将149.12主机放在了two组,[ ]中的组名称可以随意修改,在批量部署时你还可以用 All 表示主机清单中的所有主机):
/etc/ansible/hosts #主机清单配置文件
[one]
192.168.149.10
192.168.149.11
[two]
192.168.149.12
主机清单常用表示命令:
ping所有主机
ansible all -m ping
通配符
ansible "*" -m ping
ansible 192.168.149.* -m ping
ansible "srvs" -m ping
或关系
ansible "one:two" -m ping
ansible "192.168.149.10:192.168.149.11" -m ping
逻辑与
在one组并且在two组中的主机
ansible "one:&two" –m ping
正则表达式
ansible "one:two" –m ping
ansible "~(on|tw)" –m ping
下面介绍常用的ansible模块
5 ansible模块:
(1)Command 模块
功能:在远程主机执行命令,此为默认模块,可忽略-m选项
注意:此命令不支持 $VARNAME < > | ; & 等,用shell模块实现
ansible one -m command -a 'chdir=/data cat zzx.txt'
#查看data目录下的zzx.txt文件内容
ansible all -m command -a ‘chdir=/etc creates=passwd cat passwd’
#在清单中的所有主机中/etc/passwd 如果存在就不执行cat /etc/passwd 动作
ansible all -m command -a ‘chdir=/etc removes=passwd cat passwd’
#如果存在就执行
(2)Shell 模块
功能:和command相似,用shell执行命令
ansible 192.168.149.10 -m shell -a 'echo centos | passwd --stdin wang'
#修改192.168.149.10的用户登录密码(此命令仅对centos系统有用)
ansible two -m shell -a 'ls -l /data/mysql'
#查看two主机组的主机的data下的mysql下的文件属性
ansible one -m shell -a 'echo 456 > /data/zzx.txt'
#将one主机组的主机data目录下的zzx.txt文件内容输入为456
注意:如果想将shell模块代替command模块,则更改配置文件
vim /etc/ansible/ansible.cfg
修改module_name = shell
(3)Script 模块
功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)
ansible one -m script -a /data/test.sh
#在one主机组下的主机中执行本ansible服务器data下的test.sh脚本
(4)Copy 模块
功能:从ansible服务器主控端复制文件到远程主机
ansible one -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh owner=root mode=600 backup=yes"
#如目标存在,默认覆盖,此处指定先备份
src= #本机文件目录
dest #其他主机文件目录
owner #属主
mode #权限
backup #yes为先备份,默认为覆盖
ansible one -m copy -a "content='zzx line1\nzzx line2' dest=/data/test.txt"
#指定内容,直接生成目标文件 (zzx line1\nzzx1 line2 是第一行为zzx,第二行为zzx1)
content #后跟指定内容
ansible one:two -m copy -a "src=/zzx dest=/backup"
#复制/zzx目录自身,注意/zzx/后面没有/
ansible one:two -m copy -a "src=/zzx/ dest=/backup"
#复制/zzx/下的文件,不包括/zzx/目录自身,注意/zzx/后面有/
(5)Fetch 模块
功能:从远程主机提取文件至ansible的主控端,与copy相反,目前不支持目录
ansible one -m fetch -a 'src=/data/123.txt dest=/123.txt'
注意:提取文件至ansible主服务器时会产生来源主机的主机名的文件夹,更加灵活的展现出来自哪个主机的文件
(6)File 模块
功能:设置文件属性
ansible all -m file -a 'path=/data/test.txt state=touch'
ansible all -m file -a 'path=/data/test.txt state=absent'
ansible all -m file -a "path=/root/test.sh owner=wang mode=755"
#创建空文件
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"
#创建目录并设置属主属组
ansible all -m file -a 'src=/data/testfile dest=/data/testfile-link state=link'
#创建软链接
(8)unarchive 模块
功能:解包解压缩
实现有两种用法:
1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes
2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
常见参数:
copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件
remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上
src:源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
ansible all -m unarchive -a 'src=/data/zzx.gz dest=/data/ owner=root group=root'
ansible all -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=777'
ansible all -m unarchive -a ‘src=/data/mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz dest=/usr/local/ owner=root group=root copy=yes’
(8)Archive 模块
功能:打包压缩保存在被管理节点
ansible one -m archive -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=wang mode=0600
(10)Hostname 模块
功能:管理主机名
ansible one -m hostname -a "name=websrv"
ansible 192.168.149.132 -m hostname -a 'name=node18.weixiedu.com'
(11)Cron 模块
功能:计划任务
支持时间:minute,hour,day,month,weekday
ansible 192.168.149.12 -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup mysql"job=/root/mysql_backup.sh'
(12)Yum 模块
功能:管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本
ansible all -m yum -a 'name=httpd state=present' #安装
ansible all -m yum -a 'name=httpd state=absent' #删除
ansible all -m yum -a 'name=iotop,cowsay'
(13)Service 模块
功能:管理服务
ansible all -m service -a 'name=httpd state=started enabled=yes'
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=reloaded'
ansible all -m shell -a "sed -i 's/^Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf"
ansible all -m service -a 'name=httpd state=restarted'
(14)User 模块
功能:管理用户
ansible all -m user -a ‘name=zzx uid=1001 home=/data/zzx group=zzx’
创建用户
(15)Group 模块
功能:管理组
ansible all -m group -a 'name=zzx gid=1001 system=yes'
创建组
ansible all -m group -a 'name=zzx state=absent'
删除组
(16)Lineinfile 模块
ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换 。
其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换
功能:相当于sed,可以修改文件内容
ansible all -m lineinfile -a “path=/etc/init.d/mysql.server regexp='^datadir=' line='datadir=/data/mysql”
(17)Replace 模块
该模块有点类似于sed命令,主要也是基于正则进行匹配和替换,建议使用
ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"
ansible all -m replace -a "path=/etc/fstab regexp='^#(.*)' replace='\1'"
(18)Setup 模块
功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度,可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息
ansible all -m setup
ansible all -m setup -a "filter=ansible_nodename"
ansible all -m setup -a "filter=ansible_hostname"
ansible all -m setup -a "filter=ansible_domain"
ansible all -m setup -a "filter=ansible_memtotal_mb"
ansible all -m setup -a "filter=ansible_memory_mb"
ansible all -m setup -a "filter=ansible_memfree_mb"
ansible all -m setup -a "filter=ansible_os_family"
ansible all -m setup -a "filter=ansible_distribution_major_version"
ansible all -m setup -a "filter=ansible_distribution_version"
ansible all -m setup -a "filter=ansible_processor_vcpus"
ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
ansible all -m setup-a"filter=ansible_architecture"
ansible all -m setup -a "filter=ansible_processor*"
ansible自动化之playbook
playbook
是由一个或多个play
组成的列表,play
的主要功能在于将事先归并为一组的主机扮成事先通过ansible
中的task
定义好的角色。从根本上来讲,所谓的task
无非是调用ansible
的一个module
。将多个play
组织在一个playbook
中,即可以让它们联合起来按事先编排的机制完成某一任务
一个完整的playbook剧本中应包含:
hosts:
Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts
用于指定要执行指定任务的主机,须事先定义在主机清单中
- hosts: one:two
remote_user:
remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可
用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
- hosts: one:two
remote_user: root
tasks:
play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task,task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致,每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。
如果未提供name,则action的结果将用于输出
- hosts: one:two
remote_user: root
module: arguments
下面写一个简单地playbook:
利用 playbook 创建 mysql 用户
vim /etc/ansible/playbook/create_mysqluser.yaml
---
- hosts: one
remote_user: root
tasks:
- name: create group
group: name=mysql system=yes gid=1001
- name: create user
user: name=mysql shell=/sbin/nologin system=yes group=mysql uid=1001 home=/data/mysql
启动playbook:
ansible-playbook create_mysqluser.yaml
最后附一个playbook二进制批量部署安装mysql的实例:
---
- hosts: all
remote_user: root
tasks:
- name: "创建组"
group: name=mysql gid=1001 system=yes
- name: "创建用户"
user: name=mysql group=mysql uid=1001 system=yes shell=/sbin/nologin
- name: "创建运行目录"
file: path=/data/mysql state=directory owner=mysql group=mysql
- name: "传输mysql压缩包"
unarchive: src=/data/mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz dest=/usr/local/ owner=root group=root copy=yes
- name: "创建软链接"
file: src=/usr/local/mysql-8.0.13-linux-glibc2.12-x86_64 dest=/usr/local/mysql state=link
- name: "安装libaio包"
apt: name=libaio1 state=present
- name: "准备启动脚本"
shell: cp /usr/local/mysql/support-files/mysql.server /etc/init.d/
- name: "修改mysql.server中datadir"
lineinfile: path=/etc/init.d/mysql.server regexp='^datadir=' line='datadir=/data/mysql'
- name: "初始化"
shell: /usr/local/mysql/bin/mysqld --initialize-insecure --user mysql --datadir /data/mysql --initialize-insecure 加insecure为初始化不输出密码的方式
- name: "传输配置文件"
copy: src=/etc/my.cnf dest=/etc/my.cnf
- name: "创建日志文件存放目录"
file: path=/data/mysql/logs state=directory owner=mysql group=mysql
- name: "创建空日志文件"
file: path=/data/mysql/logs/mysql-error.log state=touch owner=mysql group=mysql
- name: "添加PATH变量"
copy: content='export PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh
- name: "授予x权限"
shell: chmod +x /etc/profile.d/mysql.sh
- name: "加载环境变量"
shell: chdir=/etc/profile.d/ ./mysql.sh
- name: "启动mysql"
shell: /etc/init.d/mysql.server start
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)