ansible简介/安装配置/ansible命令使用及模块介绍/Playbook/Role

ansible机器:192.168.227.128
目标机:
192.168.227.129
192.168.227.130
192.168.227.131
192.168.227.132

linux系统:centos7.9
ansible版本:2.9.18
python版本:2.7.5

一、ansible简介

官网:https://www.ansible.com/
官方文档:https://docs.ansible.com/
Ansible中文权威指南(马哥教育出品):http://ansible.com.cn/

1、自动化运维应用场景
文件传输;应用部署;配置管理;任务流编排

2、常用自动化运维工具
Ansible:python,Agentless,中小型应用环境
Saltstack:python,一般需部署agent,执行效率更高
Puppet:ruby, 功能强大,配置复杂,重型,适合大型环境
Fabric:python,agentless
Chef: ruby,国内应用少
Cfengine
func

3、ansible好处/作用:
模块化:调用特定的模块,完成特定任务
有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块;支持自定义模块
部署简单:基于python和ssh(默认已安装)
无代理:无需在客户端安装额外的agent;
简单易读,Playbook基于yaml格式构建的;
安全:基于OpenSSH,通过ssh来与远程主机通信
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
功能强大:可用于管理配置/软件安装/流程自动化;
跨平台支持:控制节点只能在linux上,被控节点支持多平台(linux/windows/网络设备/主机设备);
其他:ansible系统由控制端和被控端组成;基于python语言编写;

4、Ansible主要组成部分

ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
API:供第三方程序调用的应用程序编程接口
ANSIBLE:组合INVENTORY、API、MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具
  
	Ansible命令执行来源:
		USER,普通用户,即SYSTEM ADMINISTRATOR
		CMDB(配置管理数据库) API 调用
		PUBLIC/PRIVATE CLOUD API调用
		USER-> Ansible Playbook -> Ansibile
	利用ansible实现管理的方式:
		ansible命令:主要用于临时命令使用场景
		Ansible-playbook:主要用于长期规划好的,大型项目的场景,需要有前提的规划
	
	Ansible-playbook(剧本)执行过程:
		将已有编排好的任务集写入Ansible-Playbook
		通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行
	Ansible主要操作对象:
		HOSTS主机
		NETWORKING网络设备
	注意事项
		主控端:执行ansible的主机,又称为中控/master/堡垒机;Python版本需要2.6或以上
		被控端:Python版本小于2.4且需要安装python-simplejson;如开启SELinux需要安装libselinux-python

5、企业级自动化运维工具应用实战ansible
公司计划在年底做一次大型市场促销活动,要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多
套环境可供开发和测试人员做测试,运维老大为了在年底有所表现,要求运维部门同学尽快实现,当你接到这个任务时,有没有更快的
解决方案?

二、ansible安装配置

1、本次实验使用yum安装(epel源)
#yum install ansible -y 
#ansible --version
ansible 2.9.18
  config file = /etc/ansible/ansible.cfg
  executable location = /usr/bin/ansible
  python version = 2.7.5 
2、设置远程操控
#对要操作的所有机器设置免密登录
#ssh-keygen
#ssh-copy-id 192.168.149.131
#ssh-copy-id 192.168.149.134 
#ssh-copy-id 192.168.149.135

#配置远程主机
#[root@bogon]# vim /etc/ansible/hosts
[test]
192.168.149.13[4:5]

#测试远程操作
[root@bogon]# ansible "test" -m ping
[root@bogon]# ansible *.135 -a ls
#其他ansible命令操作见四	

三、相关文件

#rpm -ql ansible|less
#配置文件
/etc/ansible/ansible.cfg #主配置文件,配置ansible工作特性
/etc/ansible/hosts #主机清单
/etc/ansible/roles/ #存放角色的目录
#程序
/usr/bin/ansible #主程序,临时命令执行工具
/usr/bin/ansible-doc #查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy #下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-playbook #定制自动化任务,编排剧本工具
/usr/bin/ansible-pull #远程执行命令的工具
/usr/bin/ansible-vault #文件加密工具
/usr/bin/ansible-console #基于Console界面与用户交互的执行工具
1、主配置文件/etc/ansible/ansible.cfg
#vim /etc/ansible/ansible.cfg  #一般保持默认即可
[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 #默认模块
2、主机清单/etc/ansible/hosts

inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成;

#vim /etc/ansible/hosts
#inventory文件遵循INI文件风格,中括号中的字符为组名;
#可以将同一个主机同时归并到多个不同的组中;
#主机名命名模式相似时可用列表的方式标识;
[test]
192.168.227.[129:132]

#[dbsrvs]
#db-[a:f].example.com

#默认端口22,非默认端口时需使用冒号指明端口号
#www1.magedu.com:2222
3、ansible-doc常见用法
#ansible-doc #显示模块帮助
#ansible-doc -l #列出所有可用的模块
#ansible-doc ping #显示指定模块的playbook片段
#ansible-doc -s ping #某模块简要帮助用法
4、/etc/ansible/roles/ 存放角色的目录

详见六

5、ansible-galaxy常见用法

从网站安装roles:连接https://galaxy.ansible.com下载相应的roles

#ansible-galaxy list #列出所有已安装的galaxy
#ansible-galaxy install geerlingguy.redis #安装galaxy
#ansible-galaxy remove geerlingguy.redis #删除galaxy
6、ansible-pull

推送命令至远程,效率无限提升,对运维要求较高

7、ansible-playbook

执行playbook,详见五

[root@etc-2 ansible]#vim hello.yml
#hello world yml file
- hosts: test2
  remote_user: root
  tasks:
    - name: hello world
      command: /usr/bin/wall hello world
[root@etc-2 ansible]#ansible-playbook hello.yml 
#远程机器验证:
[root@k8s-master1 zydx-yaml]#
                                                                               
Broadcast message from root@k8s-master1 (somewhere) (Mon Mar 21 19:30:53 2022):
                                                                               
hello world
#ansible-playbook hello.yml
8、ansible-vault

管理加密解密yml文件

#ansible-vault [create|decrypt|edit|encrypt|rekey|view]
#ansible-vault encrypt hello.yml 加密
#ansible-vault decrypt hello.yml 解密
#ansible-vault view hello.yml 查看
#ansible-vault edit hello.yml 编辑加密文件
#ansible-vault rekey hello.yml 修改口令
#ansible-vault create new.yml 创建新文件
9、Ansible-console

2.0+新增,可交互执行命令,支持tab
root@test (2)[f:10] $
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
#设置并发数: forks n 例如: forks 10
#切换组: cd 主机组 例如: cd web
#列出当前组主机列表: list
#列出所有的内置命令: ?或help

#root@all (2)[f:5]$ list #列出当前组主机列表
#root@all (2)[f:5]$ cd appsrvs #切换组
#root@appsrvs (2)[f:5]$ yum name=httpd state=present 
#root@appsrvs (2)[f:5]$ service name=httpd state=started

四、ansible命令使用及模块介绍

ansible用法
ansible <host-pattern> [-m module_name] [-a args]
	--version #显示版本
	-m module #指定模块,默认为command
	-a MODULE_ARGS #指定模块参数,执行的命令
	-v #详细过程 –vv -vvv更详细
	--list #显示主机列表
	-k, --ask-pass #提示输入ssh连接密码,默认Key验证
	-C, --check #检查,并不执行
	-T, --timeout=TIMEOUT #执行命令的超时时间,默认10s
	-u, --user=REMOTE_#USER 执行远程执行的用户
	-b, --become #代替旧版的sudo切换
	--become-user=USERNAME #指定sudo的runas用户,默认为root
	-K, --ask-become-pass #提示输入sudo时的口令
	 
<host-pattern>匹配主机的列表
 	All
 		#ansible all –m ping #表示所有Inventory中的主机
 	* :通配符
 		#ansible “*” -m ping 
 		#ansible 192.168.1.* -m ping
 		#ansible “*srvs” -m ping
 	或关系
 		#ansible “websrvs:appsrvs” -m ping 
 		#ansible “192.168.1.10:192.168.1.20” -m ping		
	逻辑与
 		#ansible “websrvs:&dbsrvs” –m ping #在websrvs组并且在dbsrvs组中的主机
	逻辑非
 		#ansible ‘websrvs:!dbsrvs’ –m ping #在websrvs组不在dbsrvs组的主机 #注意:此处为单引号
	综合逻辑
 		#ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
	正则表达式
 		#ansible “websrvs:&dbsrvs” –m ping 
 		#ansible “~(web|db).*\.magedu\.com” –m ping	
ansible常见模块
[-m module_name]ansible常见模块

0、ping:#测试网络连通性
#ansible all -m ping -u wang -k #以wang用户执行ping存活检测
#ansible all -m ping -u wang –b -k #以wang sudo至root执行ping存活检测
#ansible all -m ping -u wang –b -k --become-user mage #以wang sudo至mage用户执行ping存活检测


1、Command:#在远程主机执行命令,默认模块,可忽略-m选项
#ansible all -m command -u wang --become-user=root -a 'ls /root' -b –k -K #以wang sudo至root用户执行ls
#ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’

2、Shell:#和command相似,此外支持 $VARNAME < > | ; & 等
#ansible srv -m shell -a 'echo magedu |passwd --stdin wang' 
#一些复杂命令比如 cat /tmp/stanley.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt等,即使使用-m shell模块也可能会失败,解决办法是将其写到脚本中到远程执行。
#可用于批量执行单条简单命令

3、Script:#在远程主机上运行ansible服务器上的脚本
#ansible websrvs -m script -a /data/f1.sh
#可用于批量执行启动脚本,备份脚本等
 
4、Copy:#从主控端复制文件到远程主机
#ansible test -m copy -a "src=/etc/ansible/hosts dest=/root/test/ backup=yes mode=600" #如目标存在,默认会被覆盖,此处backup=yes指定为先备份
#ansible test -m copy -a "content='/etc/ansible/hosts content\n' dest=/root/test/f2.sh backup=yes mode=600" #指定内容,直接生成目标文件
#可用于批量修改并推送配置文件等

5、Fetch:#从远程主机提取文件至主控端,copy相反,目前不支持目录
#ansible test -m fetch -a 'src=/root/a.sh dest=/data/scripts' 

6、File:#设置文件属性
#ansible web -m file -a "path=/root/a.sh owner=wang mode=755"
#ansible web -m file -a 'src=/app/testfile dest=/app/testfile-link state=link'
#可用于批量修改文件属性,如软链接,修改用户组权限等
 
7、unarchive:#解包解压缩,有两种用法:
#一是将ansible主机上的压缩包在本地解压缩后传到远程主机上,设置copy=yes. 
#二是将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no 
#ansible srv -m unarchive -a 'src=foo.tgz dest=/var/lib/foo'
#ansible srv -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=0777'
#ansible srv -m unarchive -a 'src=https://example.com/example.zip dest=/data copy=no'
#可用于安装部署时批量解压包至多个远程主机的指定目录
 
8、Archive:#打包压缩
#ansible all -m archive -a 'path=/etc/sysconfig dest=/data/sysconfig.tar.bz2 format=bz2 owner=wang mode=0777'
 
9、Hostname:#管理主机名
#ansible node1 -m hostname -a "name=websrv"
#可用于批量修改主机名

10、Cron:#计划任务
#支持时间:minute,hour,day,month,weekday
#ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime" #创建任务
#ansible srv -m cron -a 'state=absent name=Synctime' #删除任务
#可用于批量执行计划任务

11、Yum:#管理包
#ansible srv -m yum -a 'name=httpd state=present' #安装
#ansible srv -m yum -a 'name=httpd state=absent' #删除
#可用于批量执行安装卸载等

12、Service:#管理服务
#ansible srv -m service -a 'name=httpd state=stopped'
#ansible srv -m service -a 'name=httpd state=started enabled=yes'
#ansible srv -m service -a 'name=httpd state=reloaded'
#ansible srv -m service -a 'name=httpd state=restarted' 
#可用于批量启停服务

13、User:#管理用户
#ansible srv -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
#ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 '
#ansible srv -m user -a 'name=user1 state=absent remove=yes' #删除用户及家目录等数据

14、Group:#管理组
#ansible srv -m group -a "name=testgroup system=yes"
#ansible srv -m group -a "name=testgroup state=absent"
ansible命令执行过程
  1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
  2. 加载自己对应的模块文件,如command
  3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
  4. 给文件+x执行
  5. 执行并返回结果
  6. 删除临时py文件,退出 
执行状态:
  绿色:执行成功但受控端状态不变,如-a ping
  黄色:执行成功且受控端状态发生改变,如-a ls
  红色:执行失败

五、Playbook

ansible 常见模块使用:ping,command,shell,file,user,group,yum,service,copy,fetch,unarchive,archive ,cron ,script

Playbook核心元素
Hosts 执行的远程主机列表
Tasks 任务集
Varniables 内置变量或自定义变量在playbook中调用
Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断 ansible-playbook –t tagsname useradd.yml
案例:
1、基于ansible-playbook 实现二进制安装mariadb
[root@centos7 playbook]#vim install_mariadb.yml 
---
- hosts: 192.168.37.6
  remote_user: root

  tasks:
    - name: user
      user: name=mysql system=yes home=/data/mysql create_home=no shell=/sbin/nologin  
    - name: unarchive
      unarchive: src=/data/playbook/mariadb-10.2.25-linux-x86_64.tar.gz dest=/usr/local/  owner=root group=root
    - name: mysql link
      file: src=/usr/local/mariadb-10.2.25-linux-x86_64 dest=/usr/local/mysql state=link
    - name: mysql datadir
      file: path=/data/mysql state=directory
    - name: mysql datadir owner group
      file: path=/data/mysql owner=mysql group=mysql
    - name: mysql database
      shell: chdir=/usr/local/mysql/  scripts/mysql_install_db --datadir=/data/mysql --user=mysql
    - name: path  var
      copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh
    - name: config
      copy: src=/data/playbook/my-huge.cnf dest=/etc/my.cnf
    - name: service file
      shell: cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld 
    - name: start service
      shell:  /etc/init.d/mysqld start
2、实验:ansible-playbook 实现httpd服务部署
[root@centos7 playbook]#cat httpd.yml 
---
- hosts: appsrvs
  remote_user: root

  tasks:
    - name: install
      yum: name=httpd
    - name: config
      copy: src=/data/playbook/httpd.conf dest=/etc/httpd/conf/
      notify: restart httpd
    - name: service
      service: name=httpd state=started enabled=yes
   
  handlers:
    - name: restart httpd
      service: name=httpd state=restarted

ansible_nodename
ansible_hostname: "centos6", 
ansible_memtotal_mb
ansible_distribution_major_version
ansible_processor_vcpus


server{
	listen 81
	server_name web1.magedu.com
	root /servdata/web1
}
server{
	listen 82
	server_name web2.magedu.com
	root /data/web2
}
server{
	listen 83
	server_name web3.magedu.com
	root /data/web3
}

1 user group nginx
2 yum install nginx
3 config 
4 service 


1 install apache
2 config 
3 data
4 service 


- name: unarchive
  unarchive: src=/data/playbook/mariadb-10.2.25-linux-x86_64.tar.gz dest=/usr/local/  owner=root group=root

- name: mysql link
  file: src=/usr/local/mariadb-10.2.25-linux-x86_64 dest=/usr/local/mysql state=link
- name: mysql datadir
  file: path=/data/mysql state=directory
- name: mysql datadir owner group
  file: path=/data/mysql state=directory owner=mysql group=mysql
- name: mysql database
  shell: chdir=/usr/local/mysql/  scripts/mysql_install_db --datadir=/data/mysql --user=mysql
- name: path  var
  copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh
- name: config
  copy: src=/data/playbook/my-huge.cnf dest=/etc/my.cnf
- name: service file
  shell: cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld 
- name: start service
  shell:  /etc/init.d/mysqld start

高级功能未完待续…

六、Role

后续总结…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值