centos下安装使用ansible自动化工具

Ansible是一个开源配置管理工具,可以使用它来自动化任务,部署应用程序实现IT基础架构。Ansible可以用来自动化日常任务,比如,服务器的初始化配置、安全基线配置、更新和打补丁系统,安装软件包等。Ansible架构相对比较简单,仅需通过SSH连接客户机执行任务即可:

1 Ansible 安装

yum install -y epel-release
yum install ansible
ansible --version #查看ansible安装参数和版本

2 安装完成后传输ssh密钥给其他远程主机

ssh-keygen    #获取ssh传输key

ssh-copy-id 192.168.1.186    #传输key到指定主机(这里有哪些使用ansible的主机就传输给哪些主机)
ssh-copy-id 192.168.1.187
ssh-copy-id 192.168.1.188

3 修改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.1.186
192.168.1.187

[two] 
192.168.1.188
 

主机清单常用表示命令:


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模块

4 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.1.186 -m shell -a 'echo centos | passwd --stdin wang'

#修改192.168.1.186的用户登录密码(此命令仅对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

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值