设为首页 收藏本站
查看: 1483|回复: 0

[经验分享] Ansible相关模块

[复制链接]

尚未签到

发表于 2018-7-30 11:47:29 | 显示全部楼层 |阅读模式
  本文转载:http://nolinux.blog.51cto.com/4824967/1607459
Ansible特性
  基于Python语言实现,由Paramiko, PyYAML和Jinjia2三个关键模块;ansible在控制端只需要告诉监控端的期望状态就可以实现批量部署。
  默认使用SSH协议;
  (1) 基于密钥认证;
  (2) 在inventory文件中指定账号和密码;
  基于“模块”完成各种“任务”
  支持自定义模块:支持各种编程语言
  可以使用YAML语言定制playbook
Ansible架构图
DSC0000.jpg

  Ansible核心组件说明:
  Ansible:Ansible核心程序
  Host Lnventory:记录每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址.
  Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用.
  Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。
  Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能.
  Connection Plugins:连接插件,Ansible和Host通信使用.
环境拓扑图
DSC0001.jpg

安装Ansible
  配置好epel源,直接使用yum命令安装即可
[root@node1 ~]# yum -y install ansible  查看生成的主要文件
[root@node1 ~]# rpm -ql ansible  
/etc/ansible/ansible.cfg   #主配置文件
  
/etc/ansible/hosts         #invertory文件
  说明:Ansible不是服务,所以不需要服务脚本.
  配置和被管理的主机直接建立基于ssh的密钥认证
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''  
ssh-copy-id -i .ssh/id_rsa.pub 172.16.4.101
  
ssh-copy-id -i .ssh/id_rsa.pub 172.16.4.102
  
ssh-copy-id -i .ssh/id_rsa.pub 172.16.4.103
  定义主机,将所有被管理的主机加入到/etc/ansible/hosts中,否则无法管理
[root@node1 ~]# vim /etc/ansible/hosts  
[webserver]       #定义一个组
  
172.16.4.101
  
172.16.4.102
  
[dbserver]
  
172.16.4.103
  补充:如果没有设置基于ssh的密钥认证,可以在hosts文件中直接指定帐号和密码,方法如下所示:
[webserver]  
172.16.4.101 ansible_ssh_user=root ansible_ssh_pass=password
  
172.16.4.102 ansible_ssh_user=root ansible_ssh_pass=password
  
[dbserver]
  
172.16.4.103 ansible_ssh_user=root ansible_ssh_pass=password
模块使用:
  ansible 默认提供了很多模块来供我们使用。在 Linux 中,我们可以通过 ansible-doc -l 命令查看到当前ansible都支持哪些模块,通过 ansible-doc -s 模块名  又可以查看该模块有哪些参数可以使用。
  ansible命令应用基础:
  语法: ansible <host-pattern> [-f forks] [-m module_name] [-a args]
  -f forks:启动的并发线程数;
  -m module_name: 要使用的模块;
  -a args: 模块特有的参数;
  下面介绍比较常用的几个模块:
copy模块  
file模块
  
cron模块
  
group模块
  
user模块
  
yum模块
  
service模块
  
script模块
  
ping模块
  
command模块
  
raw模块
  
get_url模块
  
synchronize模块
  copy模块:
[root@node1 ~]# ansible-doc -s copy  
- name: 将文件复制到被管理主机
  
action: copy
  
backup          # 创建一个备份文件包括时间戳信息,如果以某种方式重创错了,还可以拿回原始文件
  
content         # 取代src=,表示直接用此处指定的信息生成为目标文件内容;
  
dest=           # 远程节点存放文件的路径,必须是绝对路径
  
directory_mode  # 递归复制设置目录权限,默认为系统默认权限
  
force           # 如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果设置为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
  
group           # 复制到远程主机后,指定文件或目录的属
  
mode            # 复制到远程主机后,指定文件或目录权限,类似与 `chmod'指明如 0644
  
owner           # 复制到远程主机后,指定文件或目录属主
  
src             # 指定复制的源文件,可以是相对路径或者绝对路径,如果给出的源是目录,那么会把目录下的所有文件都复制过去
  目的:把主控端/root目录下的a.sh文件拷贝到到指定节点上
  命令:ansible 10.1.1.113 -m copy -a 'src=/root/a.sh dest=/tmp/'
DSC0002.jpg

  在webserver组主机创建文件,自己手动指定文件内容。
DSC0003.jpg

  验证:查看文件内容
[root@node2 ~]# cat /tmp/test.ansible  
Hello Ansible
  
Hello world[root@node2 ~]#
  file模块:
[root@node1 ~]# ansible-doc -s file  
- name: 设置文件属性
  
action: file
  
force          # 需要在两种情况下强制创建软连接,一种是源文件不存在但之后会建立的情况下;另一种是目标连接已存在,需要先取消之前的软连接,有两个选项:yes|no
  
group          # 设置文件或目录的属组
  
mode           # 设置文件或目录的权限
  
owner          # 设置文件或目录的属主
  
path=          # 必选项,定义文件或目录的路径
  
recurse        # 递归设置文件的属性,只对目录有效
  
src            # 要被链接到的路径,只应用与state=link的情况
  
state          # directory:如果目录不存在,创建目录;file:即使文件不存在,也不会被创建;link:创建软连接;hard:创建硬连接;touch:如果文件不存在,则会创
  
建一个新的文件,如果文件或目录已存在,则更新其最后修改时间;absent:删除目录、文件或者取消链接文件
  目的:更改指定节点上/tmp/t.sh的权限为755,属主和属组为root
  命令:ansible all -m file -a "dest=/tmp/t.sh mode=755 owner=root group=root"
DSC0004.jpg

  在webserver组创建/test/fstab.ansible的连接文件
DSC0005.jpg

  cron模块:
[root@node1 ~]# ansible-doc -s cron  
- name: 设置管理节点生成定时任务
  
action: cron
  
backup             #如果设置,创建一个crontab备份
  
cron_file          #如果指定, 使用这个文件cron.d,而不是单个用户crontab
  
day                #日应该运行的工作( 1-31, *, */2, etc )
  
hour               #小时 ( 0-23, *, */2, etc )
  
job                #指明运行的命令是什么
  
minute             #分钟( 0-59, *, */2, etc )
  
month              #月( 1-12, *, */2, etc )
  
name               #定时任务描述
  
reboot             #任务在重启时运行,不建议使用,建议使用special_time
  
special_time       #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
  
state              #指定状态,prsent表示添加定时任务,也是默认设置,absent表示删除定时任务
  
user               #以哪个用户的身份执行
  
weekday            #周 ( 0-6 for Sunday-Saturday, *, etc )
  目的:在指定节点上定义一个计划任务,每隔3分钟到主控端更新一次时间
  命令:ansible all -m cron -a 'name="custom job" minute=*/3 hour=* day=*
month=* weekday=* job="/usr/sbin/ntpdate 172.16.254.139"'
DSC0006.jpg

  设置webServer组的主机没10分钟运行一次hello world
   DSC0007.jpg
  删除定时任务的方法如下所示:只需要设置state为absent即可
   DSC0008.jpg
  group模块:
[root@node1 ~]# ansible-doc -s group  
- name: 添加或删除组
  
action: group
  
gid       # 设置组的GID号
  
name=     # 管理组的名称
  
state     # 指定组状态,默认为创建,设置值为absent为删除
  
system    # 设置值为yes,表示为创建系统组
  目的:在所有节点上创建一个组名为nolinux,gid为2014的组
  命令:ansible all -m group -a 'gid=2014 name=nolinux'
DSC0009.jpg

  创建一个mysql组,并添加mysql用户加入到组中
DSC00010.jpg

  user模块:
[root@node1 ~]# ansible-doc -s user  
- name: 管理用户帐号
  
action: user
  
comment          # 用户的描述信息
  
createhome       # 是否创建家目录
  
force            # 在使用`state=absent'是, 行为与`userdel --force'一致.
  
group            # 指定基本组
  
groups           # 指定附加组,如果指定为('groups=')表示删除所有组
  
home             # 指定用户家目录
  
login_class      #可以设置用户的登录类 FreeBSD, OpenBSD and NetBSD系统.
  
move_home        # 如果设置为`home='时, 试图将用户主目录移动到指定的目录
  
name=            # 指定用户名
  
non_unique       # 该选项允许改变非唯一的用户ID值
  
password         # 指定用户密码
  
remove           # 在使用 `state=absent'时, 行为是与 `userdel --remove'一致.
  
shell            # 指定默认shell
  
state            #设置帐号状态,不指定为创建,指定值为absent表示删除
  
system           # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户。
  
uid              #指定用户的uid
  
update_password  # 更新用户密码
  目的:在指定节点上创建一个用户名为nolinux,组为nolinux的用户
  命令:ansible all -m user -a 'name=nolinux groups=nolinux state=present'
DSC00011.jpg

  补充:删除用户示例
DSC00012.jpg

  yum模块:
[root@node1 ~]# ansible-doc -s yum  
- name: Manages packages with the `yum' package manager
  
action: yum
  
conf_file          # yum的配置文件
  
disable_gpg_check  # 关闭gpg_check
  
disablerepo        # 不启用某个源
  
enablerepo         # 启用某个源
  
name=              # 指定要安装的包,如果有多个版本需要指定版本,否则安装最新的包
  
state              # 安装(`present'),安装最新版(`latest'),卸载程序包(`absent')
  目的:在指定节点上安装 lrzsz 服务
  命令:ansible all -m yum -a "state=present name=httpd"
DSC00013.jpg

DSC00014.jpg

setup模块
  收集远程主机的facts
  每个被管理节点在接收并运行管理命令之前,会将自己主机相关信息,如操作系统版本、IP地址等报告给远程的ansbile主机;
  示例:查看172.16.4.101主机状态信息
[root@node1 ~]# ansible 172.16.4.101 -m setup  
172.16.4.101 | success >> {
  
"ansible_facts": {
  
"ansible_all_ipv4_addresses": [
  
"172.16.4.101"
  
],
  
"ansible_all_ipv6_addresses": [
  
"fe80::20c:29ff:fef1:ddb2"
  
],
  
"ansible_architecture": "x86_64",
  
"ansible_bios_date": "05/20/2014",
  
"ansible_bios_version": "6.00",
  
"ansible_cmdline": {
  
"KEYBOARDTYPE": "pc",
  
"KEYTABLE": "us",
  
"LANG": "en_US.UTF-8",
  
"SYSFONT": "latarcyrheb-sun16",
  
"crashkernel": "auto",
  
"quiet": true,
  
"rd_LVM_LV": "vg0/root",
  
"rd_NO_DM": true,
  
"rd_NO_LUKS": true,
  
"rd_NO_MD": true,
  
"rhgb": true,
  
"ro": true,
  
"root": "/dev/mapper/vg0-root"
  service模块:
[root@node1 ~]# ansible-doc -s service  
- name: 管理服务
  
action: service
  
arguments     # 向服务传递的命令行参数
  
enabled       # 设置服务开机自动启动,参数为yes|no
  
name=         # 控制服务的名称
  
pattern       # 定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行
  
runlevel      # 设置服务自启动级别
  
sleep         # 如果执行了restarted,则在stop和start之间沉睡几秒钟
  
state         # 启动`started' 关闭`stopped' 重新启动 `restarted' 重载 `reloaded'
  目的:启动指定节点上的 puppet 服务,并让其开机自启动
  命令:ansible 10.1.1.113 -m service -a 'name=puppet state=restarted enabled=yes'
DSC00015.jpg

  启动httpd服务,并设置开机自动启动
DSC00016.jpg

DSC00017.jpg

Shell模块
  功能:执行的命令中有管道或者变量
[root@node1 ~]# ansible-doc -s shell  
- name: Execute commands in nodes.
  
action: shell
  
chdir       # 执行之前,先cd到指定目录在执行命令
  
creates     # 一个文件名,当这个文件存在,则该命令不执行
  
executable  # 切换shell来执行命令,需要使用命令的绝对路径
  
free_form=  # 执行的命令
  
removes     # 一个文件名,这个文件不存在,则该命令不执行
  为user1用户设置密码
   DSC00018.jpg
  script模块:
[root@node1 ~]# ansible-doc -s script  
- name: 将本地脚本复制到远程主机并运行之
  
action: script
  
creates      # 一个文件名,当这个文件存在,则该命令不执行
  
free_form=   # 本地脚本路径
  
removes      # 一个文件名,这个文件不存在,则该命令不执行
  目的:在指定节点上执行/root/test.sh脚本(该脚本是在ansible控制节点server上的)
DSC00019.jpg

  验证:
[root@node2 ~]# ll /tmp/script.ansible  
-rw-r--r-- 1 root root 26 Jun 28 15:21 /tmp/script.ansible
  
[root@node2 ~]# cat /tmp/script.ansible
  
hello ansible from script
  ping模块:
  目的:检查指定节点机器是否还能连通
  命令:ansible 10.1.1.113 -m ping
DSC00020.jpg

  command模块:
  目的:用于在远程主机执行命令,缺点:运行的命令中无法使用变量,管道。
[root@node1 ~]# ansible-doc -s command  
- name: 在远程节点执行命令
  
action: command
  
chdir           # 在执行命令之前,先切换到该目录
  
creates         # 一个文件名,当这个文件存在,则该命令不执行
  
executable      # 切换shell来执行命令,需要使用命令的绝对路径
  
free_form=      #要执行的Linux指令,一般使用Ansible的-a参数代替。
  
removes         #一个文件名,这个文件不存在,则该命令不执行
  命令:ansible 10.1.1.113 -m command -a 'hostname'
DSC00021.jpg

  查看被管理节点的时间,使用-m使用command模块,-a使用date命令即可
DSC00022.jpg

  raw模块:
  目的:在10.1.1.113节点上运行hostname命令
  命令:ansible 10.1.1.113 -m raw-a 'hostname|tee'
DSC00023.jpg

  get_url模块:
  目的:将http://10.1.1.116/favicon.ico文件下载到指定节点的/tmp目录下
  命令:ansible 10.1.1.113 -m get_url -a 'url=http://10.1.1.116/favicon.ico dest=/tmp'
DSC00024.jpg

  synchronize模块:
  目的:将主控方/root/a目录推送到指定节点的/tmp目录下
  命令:ansible all -m synchronize -a 'src=/root/a dest=/tmp/ compress=yes'
  执行效果:
  delete=yes   使两边的内容一样(即以推送方为主)
  compress=yes  开启压缩,默认为开启
  --exclude=.git  忽略同步.git结尾的文件
DSC00025.jpg

DSC00026.jpg

  由于模块,默认都是推送push方式。因此,如果你在使用拉取pull功能的时候,可以参考如下来实现
  mode=pull   更改推送模式为拉取模式
  目的:将10.1.1.113节点的/tmp/a目录拉取到主控节点的/root目录下
  命令:ansible 10.1.1.113 -m synchronize -a 'mode=pull src=/tmp/a dest=/root/'
DSC00027.jpg

  由于模块默认启用了archive参数,该参数默认开启了recursive, links, perms, times, owner,group和-D参数。如果你将该参数设置为no,那么你将停止很多参数,比如会导致如下目的递归失败,导致无法拉取
DSC00028.jpg

  其它相关的参数解释:
dest_port=22    # 指定目的主机的ssh端口,ansible配置文件中的 ansible_ssh_port 变量优先级高于该 dest_port 变量  
rsync_path      # 指定 rsync 命令来在远程服务器上运行。这个参考rsync命令的--rsync-path参数,--rsync-path=PATH     # 指定远程服务器上的rsync命令所在路径信息
  
rsync_timeout   # 指定 rsync 操作的 IP 超时时间,和rsync命令的 --timeout 参数效果一样
  以上暂且列举这些日常运维中经常会用到的一些模块,更多的模块信息后期会继续完善,大家也可以去官网查看
  官网地址:http://docs.ansible.com/synchronize_module.html

  Yml介绍
  Playbook是使用yaml语言定制的,YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。
  Yml语法:
- host: websrvs                #定义执行的主机  
  remote_user: root            #定义执行的用户
  
  tasks:                       #定义任务
  
    - task1                    #定义第一个任务名称
  
    module_name: module_args   #定义使用的模块,和模块参数
  
   -  task 2                   #定义第二个任务名称
  实例1
  定义一个yml:对webserver组中的主机,调用group和user模块创建组和用户;对dbserver组中的主机调用copy模块复制文件。
DSC00029.jpg

  执行yml
DSC00030.jpg

  实例2
  搭建一个apache环境
DSC00031.jpg

  准备需要复制到被管理主机的httpd.conf配置文件,修改监听端口为8080
[root@node1 ~]# mkdir conf  
[root@node1 ~]# cp /etc/httpd/conf/httpd.conf conf/
  
[root@node1 ~]# vim conf/httpd.conf
  
Listen 8080
  应用之前先停止webserver组中的httpd服务,并卸载
[root@node1 ~]# ansible webserver -a 'service httpd stop'  
[root@node1 ~]# ansible websrvs -m yum -a 'name=httpd state=absent'
DSC00032.jpg

  验证:httpd软件包已经安装,服务开机自动启动,而且也监听8080端口
[root@node2 ~]# rpm -qa httpd  
httpd-2.2.15-39.el6.centos.x86_64
  
[root@node2 ~]# chkconfig --list httpd
  
httpd          0:off1:off2:on3:on4:on5:on6:off
  
[root@node2 ~]# netstat -lntp | grep 8080
  
tcp        0      0 :::8080       :::*        LISTEN      40826/httpd
YAML中的变量
  http://ximenfeibing.blog.51cto.com/8809812/1669188

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-543545-1-1.html 上篇帖子: ansible模块使用 下篇帖子: 运维自动化之ansible playbook安装mysql-ly36843运维
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表