运维自动化工具ansible

2020-05-29 15:24:29 浏览数 (1)

企业级自动化运维工具应用实战ansible

公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备。公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测试,运维老大为了在年底有所表现,要求运维部门同学尽快实现,当你接到这个任务时,有没有更快的解决方案?

Ansible发展史

Ansible 创始人,Michael DeHaan(Cobbler 与Func 的作者) 2012-03-09,发布0.0.1版,红帽收购 2015-10-17,Red Hat宣布收购(据说是1.5 亿美元)

同类自动化工具GitHub关注程度(2016-07-10)

同类的自动化运维工具

Watch(关注)

Star(点赞)

Fork(复制)

Contributors(贡献者)

Ansible

1387

17716

5356

1428

Saltstack

530

6678

3002

1520

Puppet

463

4044

1678

425

Chef

383

4333

1806

464

Fabric

379

7334

1235

116

应用场景

  • 文件传输
  • 命令执行
    • 应用部署
    • 配置管理
    • 任务流编排

常用自动化运维工具

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

特性

  • 模块化:调用特定的模块,完成特定任务
  • 有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
  • 支持自定义模块
  • 基于Python语言实现
  • 部署简单,基于python和SSH(默认已安装),agentless
  • 安全,基于OpenSSH
  • 支持playbook编排任务
  • 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
  • 无需代理不依赖PKI(无需ssl)
  • 可使用任何编程语言写模块
  • YAML格式,编排任务,支持丰富的数据结构
  • 较强大的多层解决方案

ansible架构

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实现管理的方式: Ad-Hoc 即ansible命令,主要用于临时命令使用场景 Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划 Ansible-playbook(剧本)执行过程: 将已有编排好的任务集写入Ansible-Playbook 通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行 Ansible主要操作对象: HOSTS主机 NETWORKING网络设备 注意事项 执行ansible的主机一般称为主控端,中控,master或堡垒机主控端Py: thon版本需要2.6或以上 被控端Python版本小于2.4需要安装python-simplejson 被控端如开启SELinux需要安装libselinux-python windows不能做为主控端

ansible安装(四种方式)

  • rpm包安装: EPEL源 yum install ansible
  • 编译安装:
代码语言:javascript复制
yum -y install python-jinja2 PyYAML python-paramiko 
python-babel python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
  • Git方式安装
代码语言:javascript复制
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
  • pip安装:pip是安装Python包的管理器,类似yum
代码语言:javascript复制
yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install  --upgrade pip
pip install ansible--upgrade
  • 确认安装:ansible --version
相关文件

配置文件 /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界面与用户交互的执行工具

主机清单inventory

  • ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名
  • 默认的inventory file为/etc/ansible/hosts
  • inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成

/etc/ansible/hosts文件格式 inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明

代码语言:javascript复制
例:
[root@centos7 ~]#vim /etc/ansible/hosts
[web]
192.168.109.100
192.168.109.2

[db]
192.168.109.3
192.168.109.100 //这里默认有个all
[root@centos7 ~]#ansible db -m ping       
192.168.109.100 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.109.3 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机 示例:

代码语言:javascript复制
[websrvs]
www[01:100].example.com

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

ansible 配置文件

代码语言:javascript复制
Ansible 配置文件/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,建议取消注释第一次连接不用输入yes
#log_path = /var/log/ansible.log 生成日志文件

ansible系列命令

代码语言:javascript复制
Ansible系列命令
ansible    ansible-doc    ansible-playbook    ansible-vault ansible-console    ansible-galaxy    ansible-pull 

ansible-doc:显示模块帮助
ansible-doc [options] [module...]
-a              显示所有模块的文档
-l, --list      列出可用模块
-s, --snippet   显示指定模块的playbook片段
示例:
ansible-doc –l       列出所有模块
ansible-doc ping     查看指定模块帮助用法
ansible-doc –s  ping 查看指定模块帮助用法
代码语言:javascript复制
ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点

ansible <host-pattern> [-m module_name] [-a args] 
--version           显示版本
-m module           指定模块,默认为command
-v                  详细过程–vv-vvv更详细
--list-hosts        显示主机列表,可简写—list
-k, --ask-pass      提示连接密码,默认Key验证
-K, --ask-become-pass  提示输入sudo
-C, --check            检查,并不执行
-T, --timeout=TIMEOUT  执行命令的超时时间,默认10s
-u, --user=REMOTE_USER 执行远程执行的用户
-b, --become           代替旧版的sudo切换

ansible的Host-pattern
    匹配主机的列表
    All :表示所有Inventory中的所有主机
        ansible all –m ping 
    *  :通配符
        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命令执行过程

ansible命令执行过程ansible all -m command -a 'ls /root' 1. 加载自己的配置文件默认/etc/ansible/ansible.cfg 2. 加载自己对应的模块文件,如command 3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件 4. 给文件 x执行 5. 执行并返回结果 6. 删除临时py文件,sleep 0退出

执行状态: 绿色:执行成功并且不需要做改变的操作 黄色:执行成功并且对目标主机做变更 红色:执行失败

ansible使用示例
代码语言:javascript复制
以wang用户执行ping存活检测
ansible all -m ping -u wang -k
以wang sudo至root执行ping存活检测
ansible all -m ping -u wang –b -k
以wangsudo至mage用户执行ping存活检测
ansible all -m ping -u wang –b -k --become-user mage
以wang sudo至root用户执行ls
ansible all -m command -u wang--become-user=root -a 'ls/root' -b –k -K

ansible常用模块

Command:在远程主机执行命令,默认模块,可忽略-m选项
代码语言:javascript复制
命令:
chdir:    #运行该命令之前,切换到该目录。
creates:  #一个文件当它已经存在时,这个步骤将不运行。

ansible srvs -m command -a 'service vsftpd start' 
ansible srvs -m command -a 'echo magedu |passwd --stdin wang'   不成功此命令不支持$VARNAME < > | ;& 等,用shell模块实现
Shell:和command相似,用shell执行命令
代码语言:javascript复制
ansible srv -m shell -a 'echo xxxxx |passwd –stdin wang' 
调用bash执行命令类似cat /tmp/stanley.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器
[root@centos7 ~]#ansible all -m shell -a 'echo $HOSTNAME'
192.168.109.100 | SUCCESS | rc=0 >>
centos7.magedu.com
192.168.109.2 | SUCCESS | rc=0 >>
centos7
192.168.109.3 | SUCCESS | rc=0 >>
centos6.9
Script:运行脚本
代码语言:javascript复制
f1.sh
hostname
date .... 定义了一些脚本等

snsible websrvs -m script -a 'f1.sh'
Copy:从服务器复制文件到客户端,
代码语言:javascript复制
ansible srv -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh    owner=wang mode=600 backup=yes" 
如目标存在,默认覆盖,此处指定先备份

ansible srv -m copy -a "content='test contentn' dest=/tmp/f1.txt" 利用内容,直接生成目标文件
cron:计划任务
代码语言:javascript复制
支持时间:minute,hour,day,month,weekday
ansible srv -m cron -a "minute=*/5 job='/usr/bin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime" 创建任务
ansible srv -a 'crontab -l' 查看任务
ansible srv -m cron -a 'state=absent name=Synctime'  删除任务
计划任务目录路径 /var/spool/cron/root
ansible srv -m cron -a 'disabled=yes job="/usr/bin/ntpdate 172.16.0.1 &>/dev/null" name=Synctime'
disables=yes 前面加上注释 no的话取消注释
fetch:从客户端取文件至服务器端,copy相反,目录可先tar
代码语言:javascript复制
ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts' 
file:设置文件属性
代码语言:javascript复制
ansible srv -m file -a "path=/root/a.sh state=touch owner=wang mode=755" //创建空文件 并设置权限等

ansible web -m file -a 'src=/app/testfile  dest=/app/testfile-link state=link' //创建软连接
hostname:管理主机名
代码语言:javascript复制
ansible web -m hostname -a "name=websrv" 
yum:管理包
代码语言:javascript复制
ansible srv -m yum -a 'name=httpd state=latest'  安装
ansible srv -m yum -a 'name=httpd,tftp state=latest'  安装多个
ansible srv -m yum -a 'name=httpd state=latest update_cache=yes'  
update_cache=yes 相当于yum clean all
ansible srv -m yum -a 'name=httpd state=absent'  删除
service:管理服务
代码语言:javascript复制
ansible srv -m service -a 'name=httpd state=stopped enabled=yes'关闭并且设置开机启动 不支持多个命令
ansible srv -m service -a 'name=httpd state=started'启动
ansible srv –m service –a 'name=httpd state=reloaded'
ansible srv -m service -a 'name=httpd state=restarted'重启
user:管理用户
代码语言:javascript复制
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' 删除用户及家目录等数据
Group:管理组
代码语言:javascript复制
ansible srv -m group -a "name=testgroup system=yes"
ansible srv -m group -a "name=testgroup state=absent"

ansible系列命令

ansible-galaxy
代码语言:javascript复制
连接https://galaxy.ansible.com 下载相应的roles
中文 http://www.ansible.com.cn/index.html

列出所有已安装的galaxy 
    ansible-galaxy list
安装galaxy
    ansible-galaxy install geerlingguy.redis
删除galaxy
    ansible-galaxy remove geerlingguy.redis
ansible-pull
代码语言:javascript复制
ansible-pull
推送命令至远程,效率无限提升,对运维要求较高
Ansible-playbook
代码语言:javascript复制
ansible-playbook hello.yml
例子:
vim hello.yml
- hosts: test
  remote_user: root

  tasks:
  - name: hello world 
    command: wall "hello world"
Ansible-vault
代码语言:javascript复制
功能:管理加密解密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 创建新文件
Ansible-console
代码语言:javascript复制
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]$ list 
root@appsrvs(2)[f:5]$ yum name=httpd state=present
root@appsrvs(2)[f:5]$ service name=httpd state=started

playbook

  • playbook是由一个或多个“play”组成的列表
  • play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏
  • Playbook采用YAML语言编写

YAML介绍

  • YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外IngydötNet与Oren Ben-Kiki也是这语言的共同设计者
  • YAML Ain’tMarkup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)
  • 特性
    • YAML的可读性好
    • YAML和脚本语言的交互性好
    • YAML使用实现语言的数据类型
    • YAML有一个一致的信息模型
    • YAML易于实现
    • YAML可以基于流来处理
    • YAML表达能力强,扩展性好

更多的内容及规范参见http://www.yaml.org

YAML语法简介

  • 在单一档案中,可用连续三个连字号(——)区分多个档案。另外,还有选择性的连续三个点号( … )用来表示档案结尾
  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
  • 使用#号注释代码
  • 缩进必须是统一的,不能空格和tab混用
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
  • YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感
  • k/v的值可同行写也可换行写。同行使用:分隔
  • v可是个字符串,也可是另一个列表一个完整的代码块功能需最少元素需包括name: task
  • 一个name只能包括一个task
  • YAML文件扩展名通常为yml或yaml
YAML语法简介
代码语言:javascript复制
Dictionary:字典,通常由多个key与value构成
示例:
---
# An employee record
name: Example Developer
job: Developers
kill: Elite
也可以将key:value放置于{}中进行表示,用,分隔多个key:value
示例:
---
# An employee record
{name: Example Developer, job: Developer, skill: Elite}

YAML语法

YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用”-“来代表,Map里的键值对用”:”分隔 示例:

代码语言:javascript复制
name: John Smith
age: 41
gender: Male
spouse:
  name: Jane Smith
  age: 37
  gender: Female
children:
  - name: Jimmy Smith
    age: 17
    gender: Male
  - name: Jenny Smith
    age 13
    gender: Female

Playbook核心元素

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

  tasks:
    - name: install package
      yum: name=httpd start=present
    - name: start service
      service: name=httpd state=started enabled=yes

ansible-playbook test1.yml 执行
playbook基础组件
  • Hosts:
代码语言:javascript复制
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
可以是如下形式:
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*

Websrvs:dbsrvs两个组的并集
Websrvs:&dbsrvs两个组的交集
webservers:!phoenix  在websrvs组,但不在dbsrvs组
示例:-hosts: websrvs:dbsrvs
  • remote_user:
代码语言:javascript复制
可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
- hosts: websrvs
  remote_user: root

  tasks:
    -name: test connection
    ping: 
    remote_user: magedu
    sudo: yes       默认sudo为root
    sudo_user:wang  sudo为wang
  • task列表和action
代码语言:javascript复制
play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致

每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出
  • tasks:任务列表
代码语言:javascript复制
格式:
    (1) action: module arguments
    (2) module: arguments 建议使用
    注意:shell和command模块后面跟命令,而非key=value
某任务的状态在运行后为changed时,可通过“notify"通知给相应的handlers
任务可以通过"tags"打标签,而后可在ansible-playbook命令上使用-t指定进行调用
示例:
tasks:
  - name: disable selinux
    command: /sbin/setenforce 0
代码语言:javascript复制
如果命令或脚本的退出码不为零,可以使用如下方式替代
tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand|| /bin/true

或者使用ignore_errors来忽略错误信息:
tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand
    ignore_errors: True

运行playbook的方式
    ansible-playbook <filename.yml> ... [options]
常见选项
    --check 只检测可能会发生的改变,但不真正执行操作
    --list-hosts 列出运行任务的主机
    --limit 主机列表只针对主机列表中的主机执行
    -v 显示过程-vv-vvv更详细
示例
    ansible-playbook  file.yml --check 只检测
    ansible-playbook  file.yml 
    ansible-playbook  file.yml --limit websrvs

Playbook VS ShellScripts

代码语言:javascript复制
SHELL脚本
#!/bin/bash
# 安装Apache
yum install --quiet -y httpd
# 复制配置文件
cp /path/to/config/httpd.conf /etc/httpd/conf/httpd.conf
cp /path/to/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf
# 启动Apache,并设置开机启动
service httpd start 
chkconfig httpd on

Playbook定义
---
  - hosts: all
    tasks: 
      - name: "安装Apache"
        command: yum install -q -y httpd
      - name: "复制配置文件"
        command: cp /tmp/httpd.conf/ etc/httpd/conf/httpd.conf
        command: cp /tmp/httpd-vhosts.conf/ etc/httpd/conf/httpd-vhosts.conf
      - name: "启动Apache,并设置开机启动"
        service: name=httpd state=started enabled=yes
示例system.yml:
代码语言:javascript复制
---
  - hosts: allre
    mote_user: root

    tasks:
      - name: create mysql user
        user: name=mysql system=yes uid=36
      - name: create a group 
        group: name=httpd system=yes 
Playbook示例
代码语言:javascript复制
示例:httpd.yml

- hosts: websrvs
  remote_user: root

  tasks:
    - name: Install httpd
      yum: name=httpd state=present
    - name: Install configure file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/
    - name: start service
      service: name=httpd state=started enabled=yes

handlers和notify结合使用触发条件

  • Handlers
  • 是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作
  • notify这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作

Playbook中handlers使用

代码语言:javascript复制
- hosts:websrvs
  remote_user: root

  tasks:
    - name: Install httpd 
      yum: name=httpd state=present
    - name: Install configure file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/
      notify: restart httpd
    - name: ensure apache is running
      service: name=httpd state=started enabled=yes

    handlers:
      - name: restart httpd
        service: name=httpd status=restarted

示例:

代码语言:javascript复制
- hosts: websrvs
  remote_user: root

  tasks:
    - name: add group nginx
      tags: user
      user: name=nginx state=present
    - name: add user nginx
      user: name=nginx state=present group=nginx
    - name: Install Nginx
      yum: name=nginx state=present
    - name: config 
      copy: src=/root/config.txt dest=/etc/nginx/nginx.conf
      notify:
        - Restart Nginx
        - Check Nginx Process

    handlers:
      - name: Restart Nginx
        service: name=nginx state=restarted enabled=yes
      - name: Check Nginx process
        shell:  killall -0 nginx > /tmp/nginx.log

Playbook中tags使用

示例:httpd.yml

代码语言:javascript复制
- hosts: websrvs
  remote_user: root

  tasks:
    - name: Install httpd
      yum: name=httpd state=present
    - name: Install configure file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/
      tags: conf
    - name: start httpd service
      tags: service
      service: name=httpd state=started enabled=yes 

ansible-playbook –t conf httpd.yml
    -t //--tags
综合实例:安装httpd 并且启动端口是8080
代码语言:javascript复制
本机先安装httpd 把httpd配置文件 /etc/httpd/conf/httpd.conf 里面端口改为8080

[root@centos7 app]#cat httpd.yml 
---
- hosts: web
  remote_user: root

  tasks:
    - name: install httpd
      yum: name=httpd
    - name: copy config file
      copy: src=/app/httpd.conf dest=/etc/httpd/conf/
    - name: start httpd
      service: name=httpd state=started enabled=yes

[root@centos7 app]#ansible-playbook httpd.yml
现在把端口改为80
[root@centos7 app]#cat httpd.yml 
---
- hosts: web
  remote_user: root

  tasks:
    - name: install httpd
      yum: name=httpd
    - name: copy config file
      copy: src=/app/httpd.conf dest=/etc/httpd/conf/
      notify: restart httpd
    - name: start httpd
      service: name=httpd state=started enabled=yes


  handlers:
    - name: restart httpd
      service: name=httpd state=restarted
[root@centos7 app]#ansible-playbook --limit 192.18.109.1  httpd.yml 只针对这一台机器

[root@centos7 app]#ansible web -m shell -a 'ss -ntl|grep 80'
192.168.109.100 | SUCCESS | rc=0 >>
LISTEN     0      128         :::80                      :::*                 
192.168.109.2 | SUCCESS | rc=0 >>
LISTEN     0      128         :::80                      :::* 

0 人点赞