playbook剧本

一、ansible的主机清单

ansible默认的主机清单是/etc/ansible/hosts文件

主机清单可以手动设置,也可以通过Dynamic Inventory动态生成

一般的主机名使用FQDN

vim /etc/ansible/hosts
...
[websever]				#方括号设置组名
www1.example.org		#定义被监控主机,这里可以是主机名也可以是IP地址,主机名需要修改/etc/hsots文件
www2.example.org:2222	#冒号后面定义远程连接端口,默认是ssh 的22端口
如果是名称类似的主机,可以使用列表的方式标识各个主机
[webserver]
www[01:50].example.org ansible_ssh_user=root ansible_ssh_pass=123456

[dbbserver]
db-[a:f].example.org	#支持匹配a b c ....f

下面是Inventory中变量

(1)主机变量

[webserver]
www1magedu.com http_port=80 maxRequestsChild=808
www2magedu.com http_port=8080 maxRequestsChild=909

(2)组变量

[server:vars]
ntp_server=ntp.example.org
nfs_server=nfs.example.org

(3)组嵌套

[apache]
http1.example.org
http2.example.org

[nginx]
ngx1.example.org
ngx2.example.org

[webservers:children]
apache
nginx

(4)inventory变量参数

参数说明
ansible_ssh_host将要连接的远程主机名。与你想要设定的主机的别名不同的话,可通过此变量设置
ansible_ssh_portssh端口号。如果不是默认的端口号,通过此变量设置
ansible_ssh_user默认的ssh用户名
ansible_ssh_passssh密码(这种方式并不安全,强烈建议使用–ask-pass或SSH密钥)
ansible_ssh_private_key_filessh使用的私钥文件。适用于有多个密钥,不想使用ssh代理的情况
ansible_ssh_common_args此设置附加到sftp,scp和ssh的缺省命令行
ansible_sftp_extra_args此设置附加到默认sftp命令行
ansible_scp_extra_args此设置附加到默认scp命令行
ansible_ssh_extra_args此设置附加到默认ssh命令行
ansible_ssh_pipelining确定是否使用SSH管道。这可以覆盖ansible.cfg中得设置
ansible_shell_type目标系统的shell类型,默认情况下,命令的执行使用‘sh’语法,可设置为’csh’或’fish’
ansible_python_interpreter目标主机的python路径。适用于的情况:系统中有多个python,或者命令路径不是’/usr/bin/python’
ansible_*_nterpreter这里的“*”可以是ruby或perl或其他语言的解释器,作用和ansible_python_interpreter类似
ansible_shell_executable这将设置ansible控制器将在目标机器上使用shell,覆盖ansible.cfg中的配置,默认为/bin/sh。

二、YAML

yaml:是一种非标记语言。是用来写配置文件的语言,非常简介和强大。

yaml语法和其他语言类似,也可以表达散列表、标量等数据结构。

结构通过空格来展示;序列里配置项通过 - 表示;Map里键值使用 : 来分割;yaml的扩展名为yaml

基本语法规则:

1、大小写敏感

2、使用缩进表示层级关系

3、缩进时不允许使用Tab键,只允许使用空格

4、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

YAML支持的数据结构:

1、对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)

  • 例如: name:Example Developer
    键 值

⒉、数组:一组按次序排列的值,又称为序列(sequence)/列表(list)

  • 例如: -Apple
    -Orange

3、纯量:单个的、不可再分的值

  • 例如:number:12.30
    sure: true
yaml示例:

name:zhangsan
age:20
name:lisi
age:22
people:

三、Playbook

1、playbook概述

playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。

ansible通过不同的模块实现相应的管理,管理的方式通过定义的清单文件(hosts)所管理的主机包括认证的方式连接的端口等。所有的功能都是通过调用不同的模块(modules)来完成不同的功能的。不管是执行单条命令还是play-book都是基于清单文件。

playbook由YMAL语言编写。YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。

一个剧本里面可以有多个play,每个play只能有一个tasks,每个tasks可以有多个name

核心元素:
Playbooks  
Variables     	#变量元素,可传递给Tasks/Templates使用;  
Tasks           #任务元素,由模块定义的操作的列表,即调用模块完成任务;  
Templates  		#模板元素,使用了模板语法的文本文件;  
Handlers     	#处理器元素,通常指在某事件满足时触发的操作;  
Roles           #角色元素

playbook的基础组件:

组件信息
name定义playbook或者task的名称(描述信息),每一个play都可以完成一个任务。
hostshosts用于指定要执行指定任务的主机.
userremote_user则用于指定远程主机上的执行任务的用户
tasks任务列表play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。
vars定义变量(如果不使用内部变量需要提前定义)
vars_files调用定义变量文件
notify任务执行结果如果是发生更改了的则触发定义在handler的任务执行
handlers用于当前关注的资源发生变化时采取一定指定的操作

2、playbook剧本

1、执行一个playbook

格式:
ansible-playbook [yaml文件名]

例如:ansible-playbook ping.yml
参数:
-k(-ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u  指定用户
补充命令:
ansible-playbook nginx.yaml --syntax-check  #检查yaml文件的语法是否正确
ansible-playbook nginx.yaml --list-task     #检查tasks任务
ansible-playbook nginx.yaml --list-hosts    #检查生效的主机
ansible-playbook nginx.yaml --start-at-task='Copy Nginx.conf’   #指定从某个task开始运行

示例:

vim a.yml

- hosts: webserver						#定义的主机组,即应用的主机
  vars:									#定义变量
   http_port:80
   max_clients: 200
  user: root
  tasks:								#执行的任务
  - name: ensure apache is at the latest vertion
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name:ensure apache is running
    service: name=httpd state=started
  handles:								#处理器
    - name:restart apahce
      service: name=httpd state=restarted

2、hosts和users介绍

- hosts: webserver      #指定主机组,可以是一个或多个组。
  remote_user: root       #指定远程主机执行的用户名
vim ping.yml

- hosts: mysql
  remote_user: root
  tasks:
   - name: test connection
     ping:
     remote_user: mysql   #指定远程主机执行tasks的运行用户为mysql

执行playbook时: ansible-playbook ping.yml -k

3、指定远程主机sudo切换用户

- hosts: mysql
  remote_user: root
  become: yes     #2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_user: mysql    #指定sudo用户为mysql
  tasks:
  - name: copy text
    copy: src=/etc/fstab dest=/home/mysql/fstab.bak
  
执行playbook时: ansible-playbook ping.yml -K

示例:

vim a.yml

- hosts: 192.168.28.20
 remote_user: root
 tasks:
  - name: disable selinux
    command: " /sbin/setenforce o'
  - name: make sure apache is running
    service: name=httpd state=started

play中只要执行命令的返回值不为0,就会报错,tasks停止

修改如下
---
- hosts: webserver
 remote_user: root
 tasks:
 - name: disable selinux
   command: '/sbin/setenforce 0'
   ignore_errors: True      #忽略错误,强制返回成功
 - name: make sure apache is running
   service: name=httpd state=started

4、playbook使用变量的方法:

1.通过ansible命令传递
例如:编辑如下yaml
vim a.yml
---
- hosts: mysql
 remote_user: root
 vars:
 -user:
  tasks:
  - name: add new user
   user: name={{user}}

然后执行命令:ansible-playbook a.yml -e "user=testvar"
可以执行命令查看: ansible mysql -m command -a 'tail /etc/passwd'
2.直接在yaml中定义变量---如上handlers示例
3.直接引用一些变量
如:引用ansible的固定变量
vim test.yml

- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
   copy: content="ffansible_all_ipv4_addresses)}" dest=/opt/vars.txt
 执行命令:ansible-playbook test.yml
去183上查看vars.txt文件内容
再如:引用主机变量
vim /etc/ansible/hosts
在mysql组的主机后面添加如下
[mysql]
192.168.28.40 testvar="80.183"
#定义testvar变量的值为80.183

vim test.yml   #添加{ftestvar}主机变量

- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
    copy: content="{{ansible_all_ipv4_addresses}}.{{testvarl}}" dest=/opt/vars.txt
 
执行命令: ansible-playbook test.yml
去183上查看vars.txt文件内容

5、条件测试

如果需要根据变量、facts (setup)或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,
在task后添加when子句即可使用条件测试: when子句支持jinjia2表达式或语法,例如:

vim when.yml

- hosts: mysql
  remote_user: root
  tasks:
  - name: "shutdown CentOS"
    command: /sbin/shutdown -h now
    when: ansible_distribution == "CentOS"

1、多条件判断

vim when.yml
- hosts: mysql
  remote_user: root
  tasks:
  - name: "shut down CentOS 7 systems"
    command: /sbin/shutdown -r now
    when:
    - ansible_distribution == "CentOS"
    - ansible_distribution_major_version == “7”

2、组条件判断

vim when.yml

- hosts: mysql
  remote_user: root
  tasks:
  - name: "shut down CentOs 6 and Debian 7 systems"
    command: /sbin/shutdown -t now
    when: (ansible_distribution == "CentOs" and ansible_distribution_major_version == "6") or(ansible_distribution == "Debian" and ansible_distribution_major_version == "7")

6、迭代

当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明

vim d.yml

- hosts: webserver
  remote_user: root
  tasks:
  - name: "Install Packages"
    yum: name=ff item  state=latest
    with_items:
    - httpd
    - mysql-server
	- php

也可以自己定义

vim d.yml

- hosts: webserver
  remote_user: root
  tasks:
  - name: "Add users"
    user: name={{item.name}} state=present groups={{item.groups}}
    with_items:
    - { name:'test1',groups:'wheel'} 
	- { name:'test2',groups:'root'}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值