批量化部署工具:ansible个人笔记

(先安装依赖,再安装ansible)
[root@localhost ~]# yum -y install python-*.rpm
[root@localhost ~]# yum -y install ansible

一.定义服务器组
[root@localhost ~]# vim /etc/ansible/hosts

二.测试连通性(最好每台主机之间密钥通信,不然每次执行都需要输入密码)
(1)[root@localhost ~]# ansible all -m ping (all表示所以主机组)

(红色为执行失败,绿色则为成功,黄色只是警告,不算报错)

(2)[root@localhost ~]# ansible aliyun_server -m ping -k

       ( -k,使用密码远程其他主机)

(3)添加ssh的免秘钥登陆
[root@localhost ~]# ssh-keygen -t rsa # 使用ssh2.0版本的加密方式
[root@localhost ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.80.130 (将公钥传至目标主机,-i,指定上传的公钥)

三.使用ansible-doc查看模块
(1)查看指定模块参数
[root@localhost ~]# ansible-doc -s shell (模块名)

(2)查看所以模块
[root@localhost ~]# ansible-doc -l

四.ansible常用模块
(1)command : 用于各远程主机上运行指定的命令
[root@localhost ~]# ansible test_server -m command -a ‘ls -l /tmp’

(2)shell : 同样用于在远程主机上执行命令,但不同的shell模块可以特殊字符,而command是不支持
– chdir :指定一个目录,在执行命令之前先进入该目录
[root@localhost ~]# ansible test_server -m shell -a “ls /opt chdir=/opt”

[root@localhost ~]# ansible test_server -m shell -a "ls /etc/ | grep hosts "

[root@localhost ~]# ansible test_server -m command -a “ls /etc/ | grep hosts”

(3)copy : 将 ansible 管理主机上的文件拷贝上远程主机中
– backup:在覆盖之前将原文件备份,备份文件包含时间信息,有两个选项:yes|no
– src : 必选项,需要指定要复制的源文件路径
– dest:必选项,要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
– directory_mode:递归的设定目录的权限,默认为系统默认权限
– force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
– others:所有的file模块里的选项都可以在这里使用
– src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/“来结尾,则只复制目录里的内容,如果没有使用”/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

(4)fetch :
– dest 用来存放文件的目录。
– src 指定拉取远程文件的名字,只能为文件,不能是目录。
– fail_on_missing 如果设置为yes,当源文件不存在的时候,将会失败。
– flat 允许覆盖默认行为从hostname/path到/file的,如果dest以/结尾,它将使用源文件的
基础名称

(5)yum :
– name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径
– state:状态(present,absent,latest),表示是安装还卸载
   present:默认的,表示为安装
   lastest: 安装为最新的版本
   absent:表示删除

(6)service :
– enabled 服务是否开机启动
– must_exist 默认为True,避免当某个服务不存在的时候, 模块执行终止。
– name 服务名称
– runlevel 默认值是服务本身的默认设置。 该服务的运行级别。
– state 对服务要执行的操作, started,stopped,restarted,reloaded

(7)script : 在远程主机执行控制端的脚本文件
[root@localhost ~]# ansible web -m script -a “test.sh”

(8)user :
– name:指定用户名
– home:指定用户的家目录,需要与createhome配合使用。
– createhome:是否创建家目录 yes|no
– groups:指定用户的属组。
– uid:指定用的uid
– password:指定用户的密码。
注意:指定password参数时,不能使用明文密码,因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可
– system:是否为系统用户
– state:是创建还是删除。(present,absent)
– remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r

(9)group :
– gid:指定用的gid
– name:指定用户名
– state:是创建还是删除 (present,absent)

(10)file :
– group:定义文件/目录的属组
– mode:定义文件/目录的权限
– owner:定义文件/目录的属主
– path:必选项,定义文件/目录的路径
– recurse:递归的设置文件的属性,只对目录有效
– src:要被链接的源文件的路径,只应用于state=link的情况
– dest:被链接到的路径,只应用于state=link的情况
– state:
   directory:如果目录不存在,创建目录
   file:即使文件不存在,也不会被创建
   link:创建软链接
   hard:创建硬链接
   touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
   absent:删除目录、文件或者取消链接文件

(11)get_url : 该模块主要用于从http、ftp、https服务器上下载文件(类似与wget)
– timeout:下载超时时间,默认10s
– url:下载的URL
– dest:指定保存的目录

[root@localhost ~]# ansible test_server -m get_url -a “url=http://nginx.org/download/nginx-1.14.1.tar.gz dest=/usr/local/src”

(12)lineinfile :

(13)cron : 周期性计划任务
–backup:对远程主机上的原任务计划内容修改之前做备份
cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
–day:日(1-31,/2,……)
–hour:小时(0-23,/2,……)
–minute:分钟(0-59,/2,……)
–month:月(1-12,/2,……)
–weekday:周(0-7,*,……)
–job:要执行的任务,依赖于state=present
–name:该任务的描述
–special_time:指定什么时候执行,
参数:reboot,yearly,annually,monthly,weekly,daily,hourly
–state:确认该任务计划是创建还是删除
–user:以哪个用户的身份执行

五.playbook
playbook使用yaml语法格式,后缀可以是yaml,也可以是yml。
-v #显示过程 -vv -vvv更详细
–limit / -i #主机列表 只针对主机列表中的某个主机或者某个组执行
hosts 执行的远程主机列表
tasks 任务集
variables 内置变量或自定义变量在playbook中调用
templates 模板,即使用模板语法的文件,比如配置文件等
handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码。
when 判断 ,先判断条件,再执行tasks,时常会与register:变量名联用,
register: 变量名将其上面的输出结果保存变量中中,再使用when调用判断
ignoring_errors: playbook从上往下顺序执行,若报错,后面的命令不会在执行,若想解决可以使用ignoring_errors:True(使用这个,会有报错信息,告诉你错误忽略,继续执行下面的命令)
register关键字:可以将任务执行结果保存到一个变量中,该变量可以在模板或者playbooks文件中使用:

[root@ansible ~]# ansible-playbook -C playbook01.yml ( -C,测试运行 )

[root@ansible ~]# ansible-playbook --syntax-check lnmp.yml (检测文件语法是否正确)
[root@ansible ~]# ansible-playbook lnmp.yml -t sysstart ( -t ,可以指定tags运行,运行某一个或者多个tags(前提playbook中有定义tags))

例1:[root@ansible ~]# cat playbook01.yml
— #固定格式

  • hosts: 192.168.1.31 #定义需要执行主机或主机组
    remote_user: root #远程用户
    vars: #定义变量
    http_port: 8088 #变量

    tasks: #定义一个任务的开始

    • name: create new file #定义任务的名称
      file: name=/tmp/playtest.txt state=touch #调用模块,具体要做的事情
    • name: create new user
      user: name=test02 system=yes shell=/sbin/nologin
    • name: install package
      yum: name=httpd
    • name: config httpd
      template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify: #定义执行一个动作(action)让handlers来引用执行,与handlers配合使用
      • restart apache #notify要执行的动作,这里必须与handlers中的name定义内容
      • stop mysqld #一致
    • name: copy index.html
      copy: src=/var/www/html/index.html dest=/var/www/html/index.html
    • name: start httpd
      service: name=httpd state=started
      handlers: #处理器:更加tasks中notify定义的action触发执行相应的处理动作
    • name: restart apache #要与notify定义的内容相同
      service: name=httpd state=restarted #触发要执行的动作
    • name: stop mysqld
      service: name=mysqld state=stop

例2:[root@ansible ansible]# vim when.yml


  • hosts: cache
    remote_user: root
    tasks:
    • name
      shell: uptime | awk ‘{printf("%.2f\n",$(NF-2))}’
      register: result
    • name: 判断负载是否大于0.7,大于则停止服务
      service: name: httpd state: stopped
      when: result.stdout|float > 0.7

例3:[root@ansible ansible]# vim adduser1.yml

  • hosts: web2
    remote_user: root
    tasks:
    • name: add users
      user: group={{item.group}} password={{‘123456’ | password_hash(‘sha512’)}} name={{item.name}}
      with_items:
      - {name: ‘nb’, group: ‘root’}
      - {name: ‘dd’, group: ‘root’}
      - {name: ‘plj’, group: ‘wheel’}
      - {name: ‘lx’, group: ‘wheel’}

注:password={{‘123456’ | password_hash(‘sha512’)}},是将设置的密码加密,因为用户密码会被传到/etc/shadow文件中

include and roles
include :在编写playbook的时候随着项目越来越大,playbook越来越复杂。可以把一些play、task 或 handler放到其他文件中,通过包含进来是一个不错的选择

roles像是加强版的include,它可以引入一个项目的文件和目录
一般所需的目录层级有
vars:变量层
tasks:任务层
handlers:触发条件
files:文件
template:模板
default:默认,优先级最低

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值