(三)ansible, playbook(yuml语法,变量)

八. playbook

执行时先用 -C 检查一下语法

剧本

playbook是由一个或多个“play”组成的列表

play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作

Playbook采用YAML语言编写

在这里插入图片描述

1.YAML介绍

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:
XML、C语言、Python、Perl以及电子邮件格式RFC2822等。

YAML Ain’t Markup Language,即YAML不是XML。不过,在开发的这种语言时,
YAML的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)
特性
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
内容及规范参见:http://www.yaml.org

2.YAML语法

在单一档案中,可用连续三个连字号(——)区分多个档案。另外,还有选择性的连续三个点号( … )用来表示档案结尾

次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
使用#号注释代码
缩进必须是统一的不能空格和tab混用
缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
YAML文件内容是区别大小写的,k/v的值均需大小写敏感
一定要注意缩进格式

k键,v值

 多个k/v可同行写也可换行写,同行使用,分隔
 v可是个字符串,也可是另一个列表
 一个完整的代码块功能需最少元素需包括 name 和 task
 一个name只能包括一个task
 YAML文件扩展名通常为yml或yaml

List:列表,其所有元素均使用“ - ”打头

示例:

# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango

Dictionary:字典,通常由多个key与value构成

示例:

---
# An employee record
name: Example Developer
job: Developer
skill: Elite

也可以将key:value放置于{}中进行表示,用,分隔多个key:value

示例:写到一行

---
# An employee record
{name: Example Developer, job: Developer, skill: Elite}

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

3.三种常见的数据交换格式

在这里插入图片描述

九. Playbook核心元素

  1. Hosts 执行的远程主机列表
  2. Tasks 任务集
  3. Variables 内置变量或自定义变量在playbook中调用
  4. Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  5. Handlers 和 notity 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  6. tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。
  7. ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
ansible-playbook -t tags name useradd.yml

playbook基础组件

  1. Hosts
    playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
    可以是如下形式:
    one.example.com
    one.example.com:two.example.com
    192.168.1.50
    192.168.1.*
    Websrvs:dbsrvs ,两个组的并集
    Websrvs:&dbsrvs ,两个组的交集
    websrvs:!dbsrvs 在websrvs组,但不在dbsrvs组
    示例: - hosts: websrvs:dbsrvs

  2. remote_user: 可用于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
  1. task列表和action
    play的主体部分是task list,task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后,再开始第二个任务
    task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
    每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出

tasks:任务列表
两种格式:
(1) action: module arguments
(2) module: arguments 建议使用
模块: 参数

注意:shell和command模块后面跟命令,而非key=value

  1. 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers
    任务可以通过"tags“打标签,可在ansible-playbook命令上使用-t指定进行调用
    示例:
tasks:
	- name: disable selinux
	command: /sbin/setenforce 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

4.运行playbook

先检测-C , 后运行

可以用playbook代替shell脚本

运行playbook的方式

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

常见选项
--check或者-C 只检测可能会发生的改变,但不真正执行操作

--list-hosts 列出运行任务的主机
--list-tags 列出tag
--list-tasks 列出task
--limit 主机列表 只针对主机列表中的主机执行
-v -vv -vvv 显示过程

示例
ansible-playbook file.yml --check 只检测
ansible-playbook file.yml
ansible-playbook file.yml --limit websrvs

SHELL脚本

#!/bin/bash
# 安装httpd
yum install --quiet -y httpd
# 复制配置文件     可以用copy模块
cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
cp/tmp/vhosts.conf /etc/httpd/conf.d/
# 启动Apache,并设置开机启动
service httpd start
chkconfig httpd on

Playbook定义

4个- name 表示执行4个动作

---
- hosts: all
  remote_user: root
  tasks:
    - name: "安装httpd"
      yum: name=httpd
    - name: "复制配置文件"
      copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/
    - name: "复制配置文件"
      copy: src=/tmp/hosts.conf dest=/etc/httpd/conf.d/
    - name: "启动Apache,并设置开机启动"
      service: name=httpd state=started enabled=yes

利用 playbook 安装 nginx

---
# install nginx 
- hosts: websrvs
 remote_user: root  
 tasks:
    - name: add group nginx
     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: web page
     copy: src=files/index.html dest=/usr/share/nginx/html/index.html
    - name: Start Nginx
      service: name=nginx state=started enabled=yes

利用 playbook 安装和卸载 httpd

---
#install httpd 
- hosts: websrvs
 remote_user: root
 gather_facts: no
 tasks:
    - name: Install httpd
     yum: name=httpd state=present
    - name: Install configure file
     copy: src=files/httpd.conf dest=/etc/httpd/conf/
    - name: modify config
     lineinfile: path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 
8080'     
    - name: mkdir website dir
     file: path=/data/html state=directory
    - name: web html
     copy: src=files/index.html  dest=/data/html/
    - name: start service
      service: name=httpd state=started enabled=yes
ansible-playbook   install_httpd.yml --limit 10.0.0.8
vim remove_httpd.yml

---
- hosts: websrvs
 remote_user: root
 tasks:
   - name: remove httpd package
     yum: name=httpd state=absent
   - name: remove apache user 
     user: name=apache state=absent
   - name: remove config file
     file: name=/etc/httpd state=absent
   - name: remove web html
     file: name=/data/html/ state=absent

二进制MySQL

注意这里的copy: src=/data/playbook/my-huge.cnf dest=/etc/my.cnf
需要提前将my-hunge.cfg中添加datadir=/data/mysql

[root@centos7 playbook]#cat install_mariadb.yml 
---
- hosts: 192.168.37.6
  remote_user: root

  tasks:
    - name: user
      user: name=mysql system=yes home=/data/mysql create_home=no shell=/sbin/nologin  
    - name: unarchive
      unarchive: src=/data/playbook/mariadb-10.2.25-linux-x86_64.tar.gz dest=/usr/local/  owner=root group=root
    - name: mysql link
      file: src=/usr/local/mariadb-10.2.25-linux-x86_64 dest=/usr/local/mysql state=link
    - name: mysql datadir
      file: path=/data/mysql state=directory
    - name: mysql datadir owner group
      file: path=/data/mysql owner=mysql group=mysql
    - name: mysql database
      shell: chdir=/usr/local/mysql/  scripts/mysql_install_db --datadir=/data/mysql --user=mysql
    - name: path  var
      copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh
    - name: config
      copy: src=/data/playbook/my-huge.cnf dest=/etc/my.cnf
    - name: service file
      shell: cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld 
    - name: start service
      shell:  /etc/init.d/mysqld start

5. handlers和notify结合使用触发条件

Handlerstask列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作
Notify通知,当触发这个动作,就会执行handlers在notify中列出的操作称为handler,也即notify中调用handler中定义的操作

Playbook中handlers使用

---
- 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    //这里的名字与下面的handlers的名字相匹配
   - name: ensure apache is running
    service: name=httpd state=started enabled=yes
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted

注意:这里的notify和handlers可以定义多个,但是名字必须相互匹配

---
- 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

6.Playbook中tags使用

标签:将一个独立的任务给他加一个标签,用于执行特殊的动作
最后和 -t 连用
最后可以指定你想要还行的动作

示例: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/
     tags: conf
   - name: start httpd service
     tags: service
     service: name=httpd state=started enabled=yes

- -list-tags 列出yml文件中的标签
ansible-playbook –t conf httpd.yml 只执行conf标签的动作

十. Playbook中变量使用

调用的时候用 {{变量}}

变量名:仅能由字母、数字和下划线组成,且只能以字母开头

variable=value
http_port=80

变量来源

  1. ansible setup facts 远程主机的所有变量都可直接调用
    setup 可以列出远程主机的所有信息,参数 filter用于过滤
    例如:对一下进行过滤
    ansible_nodename
    ansible_hostname: “centos6”,
    ansible_memtotal_mb
    ansible_distribution_major_version
    ansible_processor_vcpus
 ansible 主机 -m setup -a 'filter=ansible_fqdn'

在play使用这些变量用双花括号 {{ansible_nodename}}
在这里插入图片描述

  1. 在/etc/ansible/hosts中定义
    调用的时候还是用{{ }}
    主机(普通)变量:主机组中主机单独定义,优先级高于公共变量
    组(公共)变量:针对主机组中所有主机定义统一变量
    在这里插入图片描述
    在这里插入图片描述

  2. 通过命令行指定变量,优先级最高
    -e 调用—命名

ansible-playbook -e varname=value test.yml
  1. 在playbook中定义
vars:
 - var1: value1
 - var2: value2
  1. 在独立的变量YAML文件中定义
    在这里插入图片描述
    调用的会后用vars_files: vars.yml
    在这里插入图片描述

  2. 在role中定义

如何定义 / 调用变量

  1. 使用 setup 模块中变量

本模块自动在playbook调用,不要用ansible命令调用

ansible 10.0.0.101 -m setup -a 'filter="ansible_default_ipv4"'
10.0.0.101 | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "10.0.0.101", 
            "alias": "eth0", 
            "broadcast": "10.0.0.255", 
            "gateway": "10.0.0.2", 
            "interface": "eth0", 
            "macaddress": "00:0c:29:e8:c7:9b", 
            "mtu": 1500, 
            "netmask": "255.255.255.0", 
            "network": "10.0.0.0", 
            "type": "ether"
       }
   }, 
    "changed": false
}
---
#var1.yml
- hosts: all
  remote_user: root
  gather_facts: yes
  tasks:
   - name: create log file
     file: name=/data/{{ ansible_nodename }}.log state=touch owner=wang 
mode=600
  
  
ansible-playbook var.yml
  1. 在playbook 命令行中定义变量
vim var2.yml
---
- hosts: websrvs
  remote_user: root
  tasks:
   - name: install package
     yum: name={{ pkname }} state=present

ansible-playbook –e pkname=httpd var2.yml
  1. 在playbook文件中定义变量
vim var3.yml
---
- hosts: websrvs
  remote_user: root
  ##
  vars:
    - username: user1
    - groupname: group1
  
 tasks:
    - name: create group
     group: name={{ groupname }} state=present
    - name: create user
     user: name={{ username }} group={{ groupname }} state=present


ansible-playbook -e "username=user2 groupname=group2" var3.yml
cat var4.yaml
---
 - hosts: websrvs
   remote_user: root
   vars:
     collect_info: "/data/test/{{ansible_default_ipv4['address']}}/"
   tasks:
      - name: create IP directory
        file: name="{{collect_info}}" state=directory 





#执行结果
tree /data/test/
/data/test/
└── 10.0.0.102
1 directory, 0 files

使用变量文件

可以在一个独立的playbook文件中定义变量在另一个playbook文件中引用变量文件中的变量,比playbook中定义的变量优化级高

vim vars.yml
---
package_name: mariadb-server
service_name: mariadb




vim var5.yml
---
- hosts: dbsrvs
 remote_user: root
 vars_files:
    - vars.yml
 tasks:
    - name: install package
     yum: name={{ package_name }}
     tags: install
    - name: start service
      service: name={{ service_name }} state=started enabled=yes

主机清单文件中定义变量

主机变量
在inventory 主机清单文件中为指定的主机定义变量以便于在playbook中使用

[websrvs]
www1.qcq.com http_port=80 maxRequestsPerChild=808
www2.qcq.com http_port=8080 maxRequestsPerChild=909

组(公共)变量
在inventory 主机清单文件中赋予给指定组内所有主机上的在playbook中可用的变量,如果和主机变是同名,优先级低于主机变量

[websrvs]
www1.cqq.com http_port=8080
www2.qcq.com

[websrvs:vars]
http_port=80
ntp_server=ntp.qcq.com
nfs_server=nfs.qcq.com

具体实例

vim /etc/ansible/hosts
[websrvs]
10.0.0.8 hname=www1 domain=qcq.io
10.0.0.7 hname=www2 

[websvrs:vars]
mark="-"
domain=qcq.org




ansible websvrs –m hostname –a 'name={{ hname }}{{ mark }}{{ domain }}'
bash

#命令行指定变量:
ansible websvrs –e domain=qcq.cn –m hostname –a    'name={{ hname }}{{ mark 
}}{{ domain }}'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值