Ansible(二) - playbook

简介

Playbook(剧本),是 Ansible 的任务配置文件。每一出剧本中都包含一些任务,这每个任务在 Ansible 中又被称为一出 play(戏剧)。Playbook 采用一种 YAML 语法编写。

YAML

YAML是一种置标语言。

特性:

  1. 可读性好
  2. 与脚本语言的交互性好
  3. 使用实现语言的数据类型
  4. 有一个一致的信息模型

语法:

  1. 注释: #,单行注释
  2. 清单成员,单行表示, " - "(空格加短横),或者,"[x , x , x]"(逗号加空格)
  3. 杂凑表的成员,"key : value"(冒号加空格)
  4. 在单一档案中,可用连续三个连字号(---)区分多个档案。还可以选择性的使用三个点号(...)表示文档结尾

playbook 基本用法

Ansible 可以将 shell 脚本或简单的 shell 命令转换为 Ansible play。
例如,安装 apache 的 shell 脚本:

# 安装 Apache 
yum install --quiet -y httpd httpd-devel

# 复制配置文件
cp /path/to... /etc...
cp /path/to... /etc...

# 启动 Apache,并设置开机自启
service httpd start
chkconfig httpd on

转换为完整的 playbook 后:

---
- host: all
  
  tasks:
    - name: "安装 Apache "
      command: yum install --quiet -y httpd httpd-devel
    - name: "复制配置文件"
      command: cp /path/to... /etc...
      command: cp /path/to... /etc...
    - name: "启动 Apache,并设置开机自启"
      command: service httpd start
      command: chkconfig httpd on

将以上内容放在一个名为playbook.yml的文件中,直接调用ansible-playbook命令,即可运行。

ansible-playbook ./playbook.yml

上述 playbook 中,我们用的 command 模块来运行了标准的 shell 命令,还给了每一出 play 一个 name。

Ansible 还有很多其他的内置模块,可以大幅提升处理复杂配置的能力。如:

---
- hosts: all
  sudo: yes

  tasks:
   - name: 安装Apache
     yum: name={{ item }} state=present
     with_items:
     - httpd
     - httpd-devel
   - name: 复制配置文件
     copy:
       src: "{{ item.src }}"
       dest: "{{ item.dest }}"
       owner: root
       group: root
       mode: 0644
     with_items:
     - {
       src: "/tmp/httpd.conf",
       dest: "/etc/httpd/conf/httpd.conf" 
       }
     - {
       src: "/tmp/httpd-vhosts.conf",
       dest: "/etc/httpd/conf/httpd-vhosts.conf"
       }
   - name: 检查Apache运行状态,并设置开机启动
     service: name=httpd state=started enabled=yes

---: YAML 语法中注释的用法。相当于 shell 中的 #。

- host: all:告诉 Ansible 具体要在哪些主机上运行我的剧本。 all 代表所有主机。

sudo: yes:: 告诉 Ansible 通过 sudo 来运行相应命令,yes 表示以 root 身份运行。

tasks:: 指定一系列将要运行的任务。

- name:: name 字段不是一个模块,不会执行实质性的任务,它只是给每一个 task 一个易于识别的名称,即使删除 name,也不会有任何问题。

yum:: 本例中我们使用yum模块来安装Apache。

with_items:: 说 with_items 前要先说一下 YAML 中变量的定义;
在 yaml 中可以使用 vars 关键字来定义变量。

vars:    
var_name: value
然后用{{ var_name }}的方式引用变量。

当有需要重复性执行的任务时可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用并通过with_items语句来指明迭代的元素列表即可。
示例:在被控端添加 2 个用户

方式1,最简单做法:
- name: add user testuser1    
user: name=testuser1 state=present groups=wheel   
- name: add user testuser2    
user: name=testuser2 state=present groups=wheel   

方式2,使用变量方式:
- name: add several users    
vars:    
user1: testuser1    
user2: testuser2    
user: name={{ user1 }} state=present groups=wheel   
user: name={{ user2 }} state=present groups=wheel   

方式3使用迭代方式    
- name: add several users    
user: name={{ item }} state=present groups=wheel   
with_items:     
- testuser1     
- testuser2    

事实上with_items中可以使用元素还可为hashes例如    
- name: add several users    
user: name={{ item.name }} state=present groups={{ item.groups }}    
with_items:    
- { name: 'testuser1', groups: 'wheel' }    
- { name: 'testuser2', groups: 'root' }   

所以,上述写法:

tasks:
   - name: 安装Apache
     yum: name={{ item }} state=present
     with_items:
     - httpd
     - httpd-devel

就是通过迭代的方式来执行yum install --quiet -y httpd httpd-devel
state=present选项来确保软件被安装,或者使用state=absent 来确保软件被删除。

copy:: 使用copy模块来将"src"定义的源文件(必须是ansible所在服务器上的本地文件) 复制到"dest"定义的目的地址(此地址为远程主机的上地址)去,在传递文件的同时,还定义了文件的属主,属组和权限。

Playbook与Shell脚本差异对比:
当我们把shell脚本转换为playbook运行的时候,ansible会留下清晰的执行痕迹,明确告诉我们在每一台主机上的每一步都做了什么。

当我们重复执行一个playbook时,当ansible发现系统的现有状态符合playbook所定义的状态时,anbile将自动跳过该操作。

在正式运行playbook之前,可以使用--check 或 -C 选项来检测playbook都会改变哪些内容,显示的结果跟真正执行时一模一样,但不会真的对被管理的服务器产生影响。

Ansible-playbook 其他常用命令:

限定执行范围:

如果我们运行上面的例子,会发现所有被ansible管理的主机都会被操作。
我们可以通过修改"- hosts:"字段来指定哪些主机将会应用playbook的操作:

指定一台主机:www.magedu.com
指定多台主机:www.magedu.com,www.osstep.com
指定一组主机:dbserver

当然,也可以直接通过ansible-playbook命令来指定主机:ansible-playbook playbook.yml --limit webservers
这样一来(假设你的inventory文件中包含webserver组),即便playbook中设定“hosts: all”,但也仅对webserver组生效。

如果想知道在执行playbook时,哪些主机将会受影响,则使用--list-hosts选项:
ansible-playbook playbook.yml --list-hosts

用户与权限设置

Playbook中,如果在与hosts同组的字段中没有定义user,那么Ansible将会使用你在inventory文件中定义的用户,如里inventory文件中也没定义用户,Ansible将默认使用当前系统用户身份来通过SSH连接远程主机,在远程主机中运行play内容。

我们也可以直接在ansible-playbook中使用--remote-user选项来指定用户:
ansible-playbook playbook.yml --remote-user=tom
在某些情况下,我们需要传递sudo密码到远程主机,来保证sudo命令的正常运行。这时,可以使用--ask-sudo-pass (-K)选项来交互式的输入密码。
--ask-sudo-pass
使用--sudo选项,可以强制所有play都使用sudo用户,同时使用--sudo-user选项指定切换到具体哪个用户,如果不指定,则默认以root身份运行。
比如,当前用户Tom想以Jerry的身份运行playbook,命令如下:
ansible-playbook playbook.yml --sudo --sudo-user=jerry --ask-sudo-pass
执行过程中,会要求用户输入Jerry的密码。

还有一些命令

--inventory=PATH (-i PATH):指定inventory文件,默认文件是/etc/ansible/hosts
--verbose(-v):显示详细输出,也可以使用-vvvv显示精确到每分钟的输出
--extra-vars=VARS(-e VARS):定义在playbook使用的变量,格式为:"key=value,key=value"
--forks=NUM ( -f NUM):指定并发执行的任务数,默认为5,根据服务器性能,调大这个值可提高ansible执行效率
--connection=TYPE ( -c TYPE):指定连接远程主机的方式,默认为ssh,设为local时,刚只在本地执行playbook,建议不做修改
--check:检测模式,playbook中定义的所有任务将在每台远程主机上进行检测,但并不真正执行

一些疑问

ansible-playbook 如何收集多台服务器的信息,做统一的汇总report?

ansible有一个模块叫setup, 直接在命令行运行:ansible all -m setup即可获取所有主机的各种信息,当然该模块也可在playbook中使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343