ansible playbook使用总结

Ansible playbook的使用

playbooks概念

task:

任务:使用各模块所执行的特性操作任务,比如:-m user -a ‘name= password=‘

Variables:

变量:

Templates:

模板

在定义模板后可以实现各节点对应的变量来取代,表达式自身会根据当前节点所赋值做运算,之后生成的值则赋予这个参数,用于生产不同配置的配置文件,所以模板主要实现配置不同场景文本文件

而且这种使用模板语言来定义

模板语言中可以根据定义替换成特定主机的某些值

handlers:

处理器:

如果某一次操作配置文件发生改变的话,远程和本地配置文件不一致,那么肯定是将其配置文件需要进行覆盖,这样需要在配置文件发送改变的话需要触动某些机制进行操作

说白了就是事先可以在某些条件下,比如配置发生改变)被触发的操作

Rolse:

角色:层次型组织playbooks以及其所依赖的各种资源的一种机制;其角色可以单独被调用

彼此之间的server服务器的配置肯定是完全不一样的,如果对于这些节点同时配置并提供同样的playbooks 是不可能的,所以将其每个server分成组

之间有些角色或者功能是相同的,那么比如web server 之间可能有同步时间等,某些服务是通用的,因此有了这些机制之后能够实现按需要将某个类特定服务器相同操作定义基础配置,将特定功能定义成一类操作

playbook是基于YAML语言所定义的声明试配置文件

数据结构包括:

每个横线所表示引导一个列表中的一向,通过缩进所表示具有相同缩进的元素是同一个列表的元素

如下所示,定义playbook的结构化部分:

- name : deploy web server     #定义一个任务模块,跟上这个名称

user : foouser               #使用user模块定义其使用的用户是foouer

sodu : True                  #是否允许sudo权限

hosts : all                  #对所有的主机模块生效

tasks:                     #将一个任务定义应用某一个具体操作

- name : install apache         #定义名称为install apache

apt : pkg=apache2-mpm-prefork state=latest       #使用apt模块进行安装 状态为latest

首先来定义一个httpd服务,并让其能够开机自动启动服务

[[email protected] test]# pwd

/opt/test

首先定义头部信息

- name: install httpd service

user: root

hosts: a

#再定义任务信息

tasks:

- name: install                       #定义第一个任务名称并调用yum模块,与命令一致

yum: name=httpd state=present

- name: service on                    #定义第二个任务

service: name=httpd enabled=yes state=started

执行

[[email protected] test]# ansible-playbook web.yaml

PLAY [install httpd service] **************************************************

GATHERING FACTS ***************************************************************

ok: [192.168.101.243]

ok: [192.168.101.242]

TASK: [install] ***************************************************************

changed: [192.168.101.243]

changed: [192.168.101.242]

TASK: [service on] ************************************************************

changed: [192.168.101.243]

changed: [192.168.101.242]

PLAY RECAP ********************************************************************

192.168.101.242            : ok=3    changed=2    unreachable=0    failed=0

192.168.101.243            : ok=3    changed=2    unreachable=0    failed=0

ok = 3 有3个设定执行成功,分别是1.安装 2.修改服务启动状态 3.开启服务

以上为playbook的最简单的使用

YAML语法

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

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

YAML最关键的部分为列表 字段 和映射

列表的所有元素均使用“-”打头,例如:
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango

一定要做好缩进,通过空格进行排序,排列整齐的认为是同一级别的

Ansible基础元素

facts

在套用某个主机之前先获取其各种相关数据的一种机制

获取某个节点的变量信息:

[[email protected] wangchao]# ansible 192.168.101.242 -m setup

直接返回了许多数据,这里所描述的功能表示基于setup所获取指定主机各种变量

在跟对方节点通信之前可以先将对方节点返回一些可用信息,而这些信息都是通过facts所获取的

而这些信息都是变量 都是可以被调用的,

有些变量很有用,比如:

"ansible_os_family": "RedHat",
       "ansible_pkg_mgr": "yum",

根据反馈的结果再来决定使用哪些组件来管理

可以通过这些东西来判断来应用哪些任务

获得对方的线程,无非是cpu个数x2,那么在变量中也有体现,如下所示:

"ansible_processor_cores": 1,

变量的种类

1.自定义变量

2.facts

3.主机/invertory变量  host variables

4.组变量,将多个主机定义为一个组,如下所示:

[a]

hostip

[a:vars]

ntp_server=ntp.xxx.com

组中可以嵌套一个组

[apache]

host_1

host_2

[nginx]

ngx1.xx.com

[webservers:children]

nginx

apache

[webserver:vars]

ntp_server=ntp.xxx.com

因此常见变量有以上4类

根据之前的反馈来判断任务是否执行成功

获取到某一指定的结果状态才会运行,比如:

tasks:

-command: /bin/false

register: result

ingnore_errors: True

第二种方式:

- command:/bin/something

when: result|failed          #可以根据此前执行结果做出执行

when中可以判断此前某个结果是否是所期望的,进而根据其做出判断的

迭代:

还可以实现遍历循环操作,如下所示:

在主机组a中,添加3个用户

- name: add user

remote_user: root

hosts: a

tasks:

- name: add serveral users

user: name={{items}} state=present

with_items:

- test4

- test5

- test6

这里变量必须是以{{item}}进行标记,而调用变量必须是with_items:进行赋值

让各自执行安装,但是要使用yum安装,并且只有对方包管理器是yum

需要用到变量判断的功能

涉及到:when

首先需要使用setup获取对方变量,如果使用的匹配yum,那么再进行操作

[[email protected] ~]# ansible 192.168.101.242 -m setup

涉及变量:

"ansible_pkg_mgr": "yum",

涉及参数:

when: ansible_pkg_mgr == "yum"

当变量为yum的时候才执行操作

- name: install zsh

remote_user: root

hosts: a

tasks:

- name: install zsh

yum: name=zsh state=present

    when: ansible_pkg_mgr == "yum"

执行:

[[email protected] wangchao]# ansible-playbook zsh.yaml

PLAY [install zsh] ************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.101.243]     #手机各个节点的facts信息
ok: [192.168.101.242]

TASK: [install zsh] ***********************************************************

#开始执行任务

changed: [192.168.101.243]

changed: [192.168.101.242]

PLAY RECAP ********************************************************************

#返回的执行结果
192.168.101.242            : ok=2    changed=1    unreachable=0    failed=0  
192.168.101.243            : ok=2    changed=1    unreachable=0    failed=0

补充:在使用with_items的时候还可以使用hashes

user:name={{item,name}} state=present groups={{item.group}}

with_items:

-{name:‘test1‘,gourp: ‘wheel‘}

-{name:‘test2‘,gourp: ‘root‘}

通过以上的操作,简单来说就是由多个列表,其主要功能就是将事先归并的主机,先通过tasks定义好的角色

联合起来共同完成一个任务

关于状态码

如果命令或脚本的退出状态码不为0,那么可以使用一下方式代替

tasks:

- name: run this xxx

shell: /usr/bin/somecommand || /bin/true

#或:

ignore_errors: True

playbook基础组建

handlers      触发操作

handlers用于当关注的资源发生变化时采取一定的操作

就是说只有触发的时候才会操作

使用notify这个action可以用于每个play的最后被触发,这样可以避免多次发生改变每次都执行指定的操作

所以可以指定每次什么时候出发handlers

官方给出的例子:

- name: template config file

template: src=template.j2 dest=/etc/foo.conf   #万一这个配置文件发生了改变,那么执行下面操作

notify:

- restart service                        #这里的restart是需要定义handlers的,所以要保持一致

- restart service(httpd)

handlers:

- name restart memcache

service: name=memcache state=restarted

- name: restart httpd

service: name=httpd  state=restarted

以上意思为,如果src的配置文件发生了改变,那么则触发这个handlers定义的操作

接下来我们定义一个httpd的配置文件,当文件发生改变的时候,则推送这个配置文件到各个节点并重启httpd服务

[[email protected] test]# mkdir httpd

[[email protected] test]# cd httpd/

[[email protected] httpd]# pwd

/opt/test/httpd

[[email protected] httpd]# cp /etc/httpd/conf/httpd.conf .

[[email protected] httpd]# ls

httpd.conf

为了演示效果将端口监听在8080端口

Listen 8080

效果如下:

[[email protected] httpd]# cat httpd.yaml

- name: conf

remote_user: root

hosts: a

tasks:

- name: install httpd

yum: name=httpd state=present

when: ansible_pkg_mgr == "yum"

- name: conf file

copy: src=/opt/test/httpd/httpd.conf dest=/etc/httpd/conf/httpd.conf

notify: restart httpd

- name: start httpd

service: name=httpd enabled=yes state=started

handlers:

- name: restart httpd

service: name=httpd state=restarted

以上为从检测对端是否为yum包管理器 如果是yum则安装httpd 再cp配置文件到指定目录最后将服务加到开机启动项并启动,最后重启服务

但是以上有几个步骤重复了

改进:

如果第二次执行的时候就没有必要去重新yum安装

在playbook中 其中一个选项 -t

-t表示可以执行某些特定标签对应的tasks

接下来为每个步骤都添加一个标签,如下所示:

- name: conf file

copy: src=/opt/test/httpd/httpd.conf dest=/etc/httpd/conf/httpd.conf

tags: conf

notify: restart httpd

执行:

[[email protected] httpd]# ansible-playbook httpd.yaml -t conf

PLAY [conf] *******************************************************************

GATHERING FACTS ***************************************************************

ok: [192.168.101.243]

ok: [192.168.101.242]

TASK: [conf file] *************************************************************

ok: [192.168.101.243]

ok: [192.168.101.242]

PLAY RECAP ********************************************************************

192.168.101.242            : ok=2    changed=0    unreachable=0    failed=0

192.168.101.243            : ok=2    changed=0    unreachable=0    failed=0

如果是多个任务,也可以同时使用一个tags

都在每个tasks 指定tags: conf 即可

通过目录结构的方式也将其一组资源再次切分

如下所示:

直接使用inculde进行调用其他的yaml文件

[[email protected] httpd]# mkdir tasks

将以下部分保留

[[email protected] httpd]# vim tasks/main.yaml

- name: install httpd

yum: name=httpd state=present

when: ansible_pkg_mgr == "yum"

- name: conf file

copy: src=/opt/test/httpd/httpd.conf dest=/etc/httpd/conf/httpd.conf

tags: conf

notify: restart httpd       #用来调用handlers

- name: start httpd

service: name=httpd enabled=yes state=started

编辑httpd.yaml

[[email protected] httpd]# cat httpd.yaml

- name: conf

remote_user: root

hosts: a

tasks:

include: tasks/main.yaml

定义handlers

[[email protected] httpd]# mkdir handlers

[[email protected] httpd]# cd handlers/

[[email protected] handlers]# vim main.yaml

内容如下:

- name: restart httpd

service: name=httpd state=restarted

通过以上的定义,再修改主配置文件:

[[email protected] httpd]# pwd

/opt/test/httpd

[[email protected] httpd]# cat httpd.yaml

- name: conf

remote_user: root

hosts: a

tasks:

include: tasks/main.yaml

handlers:

include: handlers/main.yaml

执行操作并查看

如果没有问题则改一下httpd.conf配置文件并指定标签

[[email protected] httpd]# ansible-playbook httpd.yaml -t conf

一个roles的案例如下所示:
          site.yml
          webservers.yml
          fooservers.yml
          roles/
             common/
               files/
               templates/
               tasks/
               handlers/
               vars/  
               meta/
             webservers/
               files/
               templates/
               tasks/
               handlers/
               vars/
               meta/

创建role的步骤

(1) 创建以roles命名的目录;
(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等;
(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;
(4) 在playbook文件中,调用各角色;

rolse

再定义一个目录rolse

[[email protected] httpd]# mkdir roles

将目录的文件都挪到roles里

[[email protected] httpd]# mv files/ handlers/ httpd.yaml tasks/ roles/web/

[[email protected] httpd]# ls roles/
web

这里的roles 表示角色目录,而这个角色名就叫做web

而在这个角色当中,通常命名为site.yaml

[[email protected] web]# mv httpd.yaml site.yaml

定义一个yaml 用于调用site.yaml

[[email protected] httpd]# cat webserver.yaml

- name: web service

remote_user: root

hosts: a

roles:

- web

时间: 2024-10-15 15:26:38

ansible playbook使用总结的相关文章

运维自动化之ansible playbook一键化解决大量主机bash更新问题

今天发现有bash漏洞,但我这里近1000台服务器,为了方便.省时间,觉得使用ansible安装bash更新包,下面分享一下我的安装方法. 1.安装的playbook的内容 19:00:03 # cd /etc/ansible [email protected]:/etc/ansible 19:00:06 # cat update_bash.yml  --- - hosts: "{{ host }}"   remote_user: "{{ user }}"   ga

ansible playbook yummodule error

ansible playbookweb.yaml[[email protected] Desktop]# cat web.yaml- name: web servers  remote_user: root  hosts: webservers tasks:  - name: install httpd    yum: name=httpd state=present  - name: httpd service     service: name=httpd enabled=yes state

运维自动化之ansible playbook安装mysql

上次介绍了如何使用ansible playbook安装zabbix客户端(http://dl528888.blog.51cto.com/2382721/1436745),这次介绍一下如何使用playbook安装mysql. 下面是安装mysql的信息: mysql_basedir: /data/mysql/basedir                    源码目录 mysql_datadir: /data/mysql/datadir                    数据目录 mysql

Ansible playbook API 开发 调用测试

Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible的二次开发. 随笔的内容分为三个部分 playbook编辑执行 python 调用API执行playbook java调用python程序进行playbook的执行 实验的环境是centos6,ansible版本是1.9.4,python版本是2.6.6,jdk版本是1.7U79 一.playboo

运维自动化之ansible playbook安装ruby环境

本来不想打算写安装ruby的,但看几个puppet的群里有人对安装ruby比较茫然,所以这里简单介绍一下如何安装ruby. ps:话说现在也就gitlab.capistrano.puppet等软件使用ruby,最新2010年的软件好的都是python了,比如ansible.salt等. 下面是安装ruby的信息: ruby_version: 1.9.3 ruby_dir: /usr/local gem_version: 1.8.23 bundle_version: 1.6.3 可以看到ruby的

Ansible Playbook - Understanding YAML

要想用Ansible操作复杂的任务,就必须要学会YAML语法的书写,不光是Ansible,连他的竞争对手saltstack也使用了YAML,下面来学习一下YAML语法的格式,省得到要你写个Playbook的时候手忙脚乱的要好. 引用一下维基:YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递回缩写.在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语

自动化运维工具ansible playbook和roles的使用

ansible的结构: Inventory 用来定义被控制端 Modules 定义被控制端可用的操作 Ad Hoc Commands 定义被控制端可以执行命令的 Playbook 批量运行的方式 Tasks: 任务:由各模块所支持执行的特定操作:可以通过ansible-doc module_name来查看帮助文档,非常详细 -m  user -a 'name= password=' Variables: 变量 Templates: 模板:(如执行httpd服务时,各节点上httpd的配置文件内容

运维自动化之ansible playbook安装node环境

现在介绍如何使用ansible安装node. 下面是安装node的信息: node_dir: /data node_version: 0.10.21 node_port: 3301 可以看到node的版本是0.10.21,测试的node应用服务监听3301端口 备注:此playbook仅能对centos或者redhat的6.x版本进行安装. 下面是安装node的playbook结构 09:33:16 # tree node_* node_delete ├── files ├── handlers

运维自动化之ansible playbook结合docker安装smokeping

本次介绍ansible的paly book结合docker进行虚拟机里安装2.6.8版本smokeping(apache版本是2.4.7). docker版本 09:26:53 # docker version Client version: 0.11.1 Client API version: 1.11 Go version (client): go1.2.1 Git commit (client): fb99f99/0.11.1 Server version: 0.11.1 Server A