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

centos下安装ansible自动化工具(超详细,包含基本使用)的更多相关文章

  1. Centos下安装nc命令工具安装以及使用

    1)netcat(nc)是一个简单而有用的工具,被誉为网络安全界的“瑞士军刀”,不仅可以通过使用TCP或UDP协议的网络连接读写数据,同时还是一个功能强大的网络调试和探测工具,能够建立你需要的几乎所有 ...

  2. CentOS 7安装Ansible

    在CentOS下安装Ansible非常的简单,但需要注意一下几点: 1.为了简单建议使用yum的epel源安装,毕竟没什么模块需要自己定制的,如果非要指定版本,可以指定不同的版本,下面会讲. 2.母机 ...

  3. linux/centos下安装nginx(rpm安装和源码安装)详细步骤

    Centos下安装nginx rpm包                                                                                 ...

  4. ansible自动化工具安装和简单使用

    ansible自动化工具安装和简单使用 1.安装 ansible依赖于Python 2.6或更高的版本.paramiko.PyYAML及Jinja2. 2.1 编译安装 解决依赖关系 # yum -y ...

  5. Centos下安装mysql 总结

    一.MySQL安装 Centos下安装mysql 请点开:http://www.centoscn.com/CentosServer/sql/2013/0817/1285.html 二.MySQL的几个 ...

  6. MyCat安装与测试教程 超详细!

    MyCat安装与测试教程 超详细! MyCat基础知识 一.什么是MYCAT? 1. 一个彻底开源的,面向企业应用开发的大数据库集群 2. 支持事务.ACID.可以替代MySQL的加强版数据库 3. ...

  7. 在Ubuntu|CentOS上安装Shutter截图工具及快捷键设置

    简介 Shutter前身叫GScrot,它是一款相当棒的截图软件. 通过Shutter,你可以截取包括选定区域.全屏幕.窗口.窗口内的控件甚至网页的图像.通过内置的强大插件机制,你可以在截图后,对图像 ...

  8. CentOS 下运维自动化 Shell 脚本之 expect

    CentOS 下运维自动化 Shell脚本之expect 一.预备知识: 1.在 Terminal 中反斜杠,即 "" 代表转义符,或称逃脱符.("echo -e与pri ...

  9. [Linux]CentOS下安装和使用tmux

    前天随意点开博客园,看到了一篇关于tmux的文章 Tmux - Linux从业者必备利器,特意还点进去看了.毕竟Linux对于做游戏服务端开发的我来说,太熟悉不过了.不过我就粗略地看了一眼,就关掉了. ...

随机推荐

  1. bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版

    bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版 传送门:bzoj  bzoj wdnmd为什么加强版不是权限题原题却是啊 3545: [ONTAK2010]Pe ...

  2. 最新出炉的Java面试题(2022亲身经历)

    面试题清单 个人近来面试了不少的公司的,该挂的挂,该应付通过的应付通过,目前对面试题部分做一个系统的总结.最起码要保证被问过的问题第二次被问到的时候是可以回答并且理解的.算是一个被动输入学习的过程. ...

  3. Vue-cli安装步骤,搭建一个完整的 Vue 项目

    安装node环境下载 node.js 官网地址:https://nodejs.org/en/ 下载完成后打开然后一路next安装完成后打开 dos 窗口输入命令:node -v 回车会输出node的版 ...

  4. 如果你的Serializable类包含一个不可序列化的成员,会发生什么?你是如何解决的?

    任何序列化该类的尝试都会因NotSerializableException而失败,但这可以通过在 Java中 为 static 设置瞬态(trancient)变量来轻松解决. Java 序列化相关的常 ...

  5. springcloud如何实现服务的注册?

    1.服务发布时,指定对应的服务名,将服务注册到 注册中心(eureka zookeeper)2.注册中心加@EnableEurekaServer,服务用@EnableDiscoveryClient,然 ...

  6. 详细描述一下 Elasticsearch 索引文档的过程 ?

    面试官:想了解 ES 的底层原理,不再只关注业务层面了. 解答: 这里的索引文档应该理解为文档写入 ES,创建索引的过程. 文档写入包含:单文档写入和批量 bulk 写入,这里只解释一下:单文档写入流 ...

  7. Elasticsearch 中的节点(比如共 20 个),其中的 10 个 选了一个 master,另外 10 个选了另一个 master,怎么办?

    1.当集群 master 候选数量不小于 3 个时,可以通过设置最少投票通过数量(discovery.zen.minimum_master_nodes)超过所有候选节点一半以上来解决脑裂问题: 2.当 ...

  8. TIME_WAIT 优化

    ·[场景描述] HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟. 如果我们使用了nginx去作为 ...

  9. 学习Squid(三)

    Squid 缓存服务 1.缓存服务器结束 缓存服务器(cache server),即用来存储(介质为内存及硬盘)用户访问的网页.图片.文件等等信息的专用服务器,这种服务器不仅可以使用户可以最快的得到他 ...

  10. Numpy怎样将数组读写到文件

    Numpy怎样将数组读写到文件 本文档介绍的是Numpy以自己内建二进制的方式,将数组写出到文件,以及从文件加载数组: 如果是文本.表格类数据,一般使用pandas这个类库做加载和处理,不用numpy ...