Ansible从入门到精通【四】

简介: Ansible从入门到精通 立志成为ansible大佬

大家好,我是早九晚十二,目前是做运维相关的工作。写博客是为了积累,希望大家一起进步!

image.png

play-book的介绍

play-book是由一个或者多个play组成的列表。play的主要功能是将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上讲,所谓task无非是调用ansible的一个moudle。将多个play组织在一个playbook里,即可以让它们连同起来按照事先编排的机制同唱一台大戏。
playbook采用的是YAML语言编写,后缀可以使yml也可以yaml

play-book 的执行顺序

image.png

YAML的介绍

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

YAML官方网站:http://www.yaml.org
image.png

语法简介(YAML)

以以下剧本为例

---
 - hosts: all
  remote_user: root
  gather_facts: false
  become: yes

  tasks:
    - name: copy test
      copy:
        src: "{
   
   {item.src}}"
        dest: "{
   
   {item.dest}}"
        owner: root
        group: root
        mode: 0755
      with_items:
        - {
   
   src: "/root/ansible/hostname.sh",dest: "/tmp"}
...

语法介绍

  • 在单一档案中,可以用三个连字号(---)区分多个档案,另外还有选择性的联系三个点号(...)结尾
  • 次行开始正常写playbook的内容,一般建议写明该playbook的功能
  • 使用#做注释
  • 缩进必须是统一的,不能tab和空格混用
  • 缩进的级别也必须一致,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进和换行实现的
  • YAML文件内容和Linux系统大小写判断方式一致:即区分大小写,k/v的值均需大小写敏感
  • k/v的值也可同行也可换行,同行用:分隔
  • v可以是字符串,也可以是另一个列表
  • 一个完整的代码块功能最小需要包括name和task
  • 一个name只能包含一个task
  • YAML文件扩展名通常为yml或者yaml

    元素介绍

  • List:列表,其所有元素均使用“-”打头,如 - name: copy test - hosts: all
  • Dictionary:字典,通常由多个key与value组成,如: src: "{ {item.src}}" dest: "{ {item.dest}}"

注意,yaml的语法和其他高阶语言类似,可以简单的表达清单,散列表,标量等数据结构。其结构通过空格来展示,序列里的项用“-”代表,map里的键值用“:”分隔。

playbook的核心元素

元素 介绍
Hosts 执行任务的远程主机列表
Tasks 任务集
Varniables 内置变量或者自定义变量,在playbook中调用
Templates 模板,可替换模板文件中的变量并实现一些简单的逻辑
Handlers和notity 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签,指定某条任务执行,由于选择运行playbook的部分代码。ansible具有幂等性,因此会跳过没有变化的部分,即使如此,有些代码未测试其确实没有发生变化的时间依然会非常的长。此时,如果确认没有发生变化,就可以用tags跳过。执行方法:ansible-playbook -t tagsname test.yml

Hosts

playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,必须先定义在主机清单中。
可能是如下形式:

test.example.com
test1.exxample.com:test2.example.com
192.168.1.1
192.168.*.*
test:test1 两个组并集
test:&test1 两个组交集
test:!test1 在test,但是不在test1
示例:- hosts: test:test1

remote_user

可用于host和task中,也可以通过指定其通过sudo的方式在远程主机上执行任务,可用于play全局或者某任务。此外,甚至也可以在sudo时使用sudo_user指定sudo时切换的用户。

- hosts: all
  remote_user: root
  sudo: yes  #默认sudo为root
  sudo_user: haha  #sudo为haha

tasks

任务列表,格式包含以下两种

action:module arguments
module:arguments  #建议使用

某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers。也可以通过“tags”打标签,而后可在ansible-playbook命令上使用-t指定进行调用。

执行问题忽略

如果playbook中命令或者脚本的退出码不为0,可以使用如下方式替代

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的常用选项

运行playbook的方式

ansible-playbook <filename.yml> ... [options]

常见选项

选项 含义
--check 只检测可能会发生的改变,但不真正执行操作
--list-hosts 列出运行任务的主机
--limit 主机列表,只针对主机列表中的主机执行
-v 显示过程,-vv,-vvv更详细
--check 只检测可能会发生的改变,但不真正执行操作
[root@master ansible]# ansible-playbook copy.yml --list-hosts

playbook: copy.yml

  play #1 (all): all    TAGS: []
    pattern: [u'all']
    hosts (1):
      192.168.1.1
[root@master ansible]# ansible-playbook copy.yml --list-tasks

playbook: copy.yml

  play #1 (all): all    TAGS: []
    tasks:
      copy test    TAGS: []

playbook中可以指定相对路径,相对路径的默认目录在/root/.ansible中

相关文章
|
7月前
|
应用服务中间件 nginx
Ansible从入门到精通【六】
Ansible从入门到精通【六】
|
9月前
|
运维
Ansible从入门到精通【五】
Ansible从入门到精通 立志成为ansible大佬
|
9月前
|
运维 应用服务中间件 nginx
Ansible从入门到精通【六】
Ansible从入门到精通 立志成为ansible大佬-模板templates
|
9月前
|
JSON 运维 网络安全
Ansible从入门到精通【一】
Ansible从入门到精通 立志成为ansible大佬-基本理论了解
|
9月前
|
运维 安全 Shell
Ansible从入门到精通【二】
Ansible从入门到精通 立志成为ansible大佬-ansible常用模块详解
|
9月前
|
运维 数据安全/隐私保护
Ansible从入门到精通【三】
Ansible从入门到精通 立志成为ansible大佬
|
7月前
|
运维 Shell Linux
Ansible自动化运维工具之常用模块使用实战(5)
Ansible自动化运维工具之常用模块使用实战(5)
|
9月前
|
网络协议 网络安全
Ansible模块介绍——防火墙模块
Ansible模块介绍——防火墙模块
145 0
|
7月前
|
运维 Linux
Ansible自动化运维工具之常用模块使用实战(6)
Ansible自动化运维工具之常用模块使用实战(6)
|
6月前
|
网络安全 数据安全/隐私保护
ansible的get_url模块
ansible的get_url模块