我是靠谱客的博主 慈祥冬日,最近开发中收集的这篇文章主要介绍ansible剧本操作YAML概述playbook概述playbook剧本配置条件测试迭代,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • YAML概述
    • YAML介绍
    • 基本语法规则
    • YAML支持的数据结构
  • playbook概述
    • 三要素
    • 组成结构
    • 部署准备
  • playbook剧本配置
    • 设置连通性脚本
    • 指定远程用户切换用户执行任务
    • tasks列表和action
    • 变量配置
      • Handlers介绍
      • 在playlook中设置变量,执行
      • 通过ansible命令传递
      • 系统,固定变量
      • 在hosts配置文件中定义
  • 条件测试
    • 单条件判断
    • 多条件判断
    • 组条件判断
  • 迭代

YAML概述

YAML介绍

YAML:是一种非标记语言。是用来写配置文件的语言,非常简洁和强大。
YAML语法和其他语言类似,也可以表达散列表、标量等数据结构。

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

基本语法规则

1.大小写敏感
2.使用缩进表示层级关系
3.缩进时不允许使用Tab键,只允许使用空格。
4.缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

YAML支持的数据结构

1.对象:键值对的集合,又称为映射(mapping) /哈希(hashes) /字典(dictionary)
例如: name:Example Developer
变量名:对象名 属性

2.数组: 一组按次序排列的值,又称为序列(sequence) / 列表(list)
例如: -Apple
-Orange

3.纯量: 单个的,不可再分的值
例如: number: 12.30
sure: true
变量名:数值
用法示例

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

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

playbook概述

ansible的脚本—playbook剧本

三要素


剧本                playbook
1.场地            1.主机组hosts
2.演员            2.授权执行的用户 remote_user
3.故事情节         3.执行的任务 tasks(调用的是各种ansible模块)

组成结构

通过task调用ansible的模板将多个play组织在一 个playbook中运行。
playbooks本身由以下各部分组成

(1) Tasks: 任务,即调用模块完成的某操作;
(2) Variables: 变量
(3) Templates: 模板
(4) Handlers: 处理器(定义的函数,定义多个任务),当某条件满足时,触发执行的操作,多次调用只执行一次
(5) Roles: 角色

playbook用法示例

hosts: webserver   定义的主机组,即应用的主机
vars:              定义变量
变量名      值
http_port: 80
max_clients: 200
user: root
tasks:         执行的任务
- name: ensure apache is at the latest version    标题
   yum: pkg=httpd state=latest                    操作
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:  调用,调取  关联自动加载handlers模块
- restart apache
- name: ensure apache is running
service: name=httpd state=started   保证httpd服务器保持开启状态
handlers:      处理器
- name: restart apache
service: name=httpd state=restarted 服务重启,先关闭后启动,stop状态restarted无意义,start状态有意义

执行playbook用法示例:
ansible-playbook [yam|文件名]
例如: ansible-playbook ping.yaml

参数: (免密登录)
-k( ask-pass)用来交互输入ssh密码
-K(-ask-become-pass)用来交互输入sudo密码
-u 指定用户

hosts和users差别
hosts: webserver 指定主机组,可以是-一个或多个组。
remote user: root 指定远程主机执行的用户名s

部署准备

管理端master:20.0.0.10
被管理端node1:20.0.0.11
被管理端node2:20.0.0.12

关闭防火墙
面向所有设备

[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0

安装ansible

[root@master ~]# yum -y install ansible  安装ansible

配置主机清单

[root@master ~]# vi /etc/ansible/hosts
添加,定义打上标签名称
[webserver]
20.0.0.11
[mysql]
20.0.0.12

在这里插入图片描述
建立联系

[root@master ~]# ssh-keygen -t rsa   生成密钥
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):    生成密钥存储位置
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):   对密钥设置密码加密,密码123123
Enter same passphrase again:  再次确认密码123123
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:vBwgnptNmeeOrnbTOrwMOfybBwlcdyHRBZZq+v1IUd0 root@master
The key's randomart image is:
+---[RSA 2048]----+
|        oo+=.    |
|      . .o+  . . |
|   ..... o  . . E|
|   .oo =o  .     |
|    o.++S .      |
|   . *++ o .     |
|    B..++..      |
|    .==++...     |
|   ..+XB. ...    |
+----[SHA256]-----+

公钥发送给node1.2

[root@master .ssh]# ssh-copy-id root@20.0.0.11
[root@master .ssh]# ssh-copy-id root@20.0.0.12
输入接收方root方密码123123

[root@master ~]# ansible all -m ping 查看与所有节点设备的连通性

在这里插入图片描述
以上完成ansible的基础配置操作

playbook剧本配置

[root@master01 opt]# vim /etc/ansible/hosts //指定地址
[webserver]
20.0.0.11
[mysql]
20.0.0.12

设置连通性脚本

[root@master01 opt]# vim a.yaml  //写一个简单的小剧本
- hosts: webserver  #指定主机组
  remote_user: root #指定远程主机执行的用户名
[root@master01 opt]# ansible-playbook a.yaml 

在这里插入图片描述

[root@master01 opt]# ansible-playbook a.yaml --syntax-check //检查语法正确性

在这里插入图片描述

root@master01 ~]# vim a.yaml

- hosts: webserver
  remote_user: root
  tasks:
   - name: test connect
     ping:
     remote_user: root  #指定远程主机执行tasks的运行用户
[root@master01 ~]# ansible-playbook a.yaml

在这里插入图片描述

指定远程用户切换用户执行任务

[root@master ~]# vi a.yaml  编辑脚本
[root@master ~]# ansible-playbook demo01.yaml --syntax-check 检查语法
[root@master ~]# ansible-playbook demo01.yaml   执行脚本
修改添加
- hosts: webserver
  remote_user: root
  become: yes          切换用户运行
  become_user: wangwu  指定远程用户为wangwu
  tasks:               执行任务
  - name: copy text    复制测试
    copy: src=/etc/fstab dest=/opt/fstab.bak
         原文件        目标位置

出现报错,目的地/opt不可写
wangwu用户对opt目录无写权限

[root@master ~]# vi demo01.yaml 
[root@master ~]# ansible-playbook demo01.yaml --syntax-check
playbook: demo01.yaml
[root@master ~]# ansible-playbook demo01.yaml 

修改设置
- hosts: webserver
  remote_user: root
  become: yes
  become_user: wangwu
  tasks:
  - name: copy text
    copy: src=/etc/fstab dest=/home/wangwu/fstab.bak

在node1上查看

[root@node1 wangwu]# ls -lh  查看
总用量 4.0K
-rw-r--r--. 1 wangwu wangwu 617 113 22:27 fstab.bak

tasks列表和action

1.Play的主体部分是task列表, task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务,在运行playbook时(从上到下执行) ,如果一个host执行task失败,tasks会回滚到报错前的状态,即在报错前的操作命令会执行,但报错后的命令不会执行;在修正playbook中的错误后,重新执行即可。

Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一致。

2.每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。

3.定义一个task, 常见的格式:”module: options" 例如: yum: name=httpd

4.ansible的自带模块中,command模块和shell模块无需使用key=value格式

[root@master ~]# vi demo02.yaml 
[root@master ~]# ansible-playbook demo02.yaml --syntax-check     语法检查
[root@master ~]# ansible-playbook demo02.yaml                            执行脚本

编辑修改
- hosts: webserver
  remote_user: root
  tasks:
  - name: install httpd  安装httpd
    yum: name=httpd
  - name: start httpd    开启httpd服务
    service: name=httpd state=started
  - name: stop firewalld   关闭防火墙
    service: name=firewall state=stopped
  - name: touch index       设置网页页面文件
    copy: content="haha" dest=/var/www/html/index.html
            具体内容                         目标位置

出现报错:未找到firewall服务

在node1上查看
回滚情况

[root@node1 ~]# rpm -q httpd   查看已安装httpd情况
[root@node1 ~]# systemctl status httpd  查看httpd服务状态
[root@node1 ~]# cd /var/www/html/  查看网页页面文件
[root@node1 html]# ls -lh

在报错之后添加ignore_errors: True 可以忽略错误,强制返回成功,不影响之后的任务执行
在对不确定某一条任务能否可以顺利的执行时可以,使用添加该命令,以保证后续进程的继续。

[root@master ~]# vi demo02.yaml 
[root@master ~]# ansible-playbook demo02.yaml --syntax-check 语法检查
playbook: demo02.yaml 
[root@master ~]# ansible-playbook demo02.yaml  执行脚本

- hosts: webserver
  remote_user: root
  tasks:
  - name: install httpd
    yum: name=httpd
  - name: start httpd
    service: name=httpd state=started
  - name: stop firewalld
    service: name=firewall state=stopped
    ignore_errors: True
  - name: touch index
    copy: content="haha" dest=/var/www/html/index.html

针对不同的节点用户分别进行执行对应不同的任务

[root@master ~]# vi demo03.yaml
[root@master ~]# ansible-playbook demo03.yaml --syntax-check  语法检查
[root@master ~]# ansible-playbook demo03.yaml   执行脚本
设置
- hosts: webserver   用户node1
  remote_user: root
  tasks:
  - name: create nginx group     创建组
    group: name=nginx system=yes gid=300  创建一个系统型普通用户
  - name: create nginx user
    user: name=nginx system=yes uid=300 group=nginx  创建用户
- hosts: mysql   用户节点node2
  remote_user: root
  tasks:
  - name: copy file to mysql   复制
    copy: src=/etc/inittab dest=/opt/inittab.bak
将master管理端的原文件复制到远程节点上目标位置

变量配置

Handlers介绍

Handlers也是一些task的列表,和一般的task并没有什么区别。
是由通知者进行的notify,如果没有被notify, 则Handlers不会执行,假如被notify了, 则Handlers被执行
不管有多少个通知者进行了notify, 等到play中的所有task执行完成之后,handlers也只会被执行一次

在playlook中设置变量,执行

[root@master ~]# vi demo02.yaml 
[root@master ~]# ansible-playbook demo02.yaml --syntax-check
playbook: demo02.yaml
[root@master ~]# ansible-playbook demo02.yaml

- hosts: webserver
  remote_user: root
  vars:
  - apple: httpd   变量:数值
  tasks:
  - name: install httpd
    yum: name={{apple}}   
  - name: start httpd
    service: name={{apple}} state=started
  - name: stop firewalld
    service: name=firewalld state=stopped
    ignore_errors: True
  - name: touch index
    copy: content="this is a tree" dest=/var/www/html/index.html

通过ansible命令传递

[root@master ~]# vi demo02.yaml 
[root@master ~]# ansible-playbook demo02.yaml --syntax-check
playbook: demo02.yaml
[root@master ~]# ansible-playbook demo02.yaml -e "apple=httpd"
 
- hosts: webserver
  remote_user: root
  vars:
  - apple: 
  tasks:
  - name: install httpd
    yum: name={{apple}}
  - name: start httpd
    service: name={{apple}} state=started
  - name: stop firewalld
    service: name=firewalld state=stopped
    ignore_errors: True
  - name: touch index
    copy: content="haha" dest=/var/www/html/index.html

系统,固定变量

[root@master ~]# vi zdybl.yaml
[root@master ~]# ansible-playbook zdybl.yaml --syntax-check 检查语法
playbook: zdybl.yaml
[root@master ~]# ansible-playbook zdybl.yaml  执行脚本

- hosts: mysql
  remote_user: root
  tasks:
  - name: copy
    copy: content="{{ansible_all_ipv4_addresses}}" dest=/opt/addr.txt
捕捉获取节点中ip地址,到目标位置

在hosts配置文件中定义

[root@master ~]# vi zdybl.yaml
[root@master ~]# vi /etc/ansible/hosts 
[root@master ~]# vi zdybl.yaml 
[root@master ~]# ansible-playbook zdybl.yaml --syntax-check

playbook: zdybl.yaml
[root@master ~]# ansible-playbook zdybl.yaml 

修改添加
20.0.0.12 num="123456"

变量形式
1.直接定义在剧本中,可以直接使用,
2.定义命令中 直接传入
3.利用系统自带的,固定变量
4.定义在hosts文件中
服务变量
1.剧本使用的 服务器名称,数据
2. 命令 ip地址,测试
3.固定变量
4.节点hosts 以系统的参数值

条件测试

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

单条件判断

[root@master ~]# vi tj.yaml
[root@master ~]# ansible-playbook tj.yaml --syntax-check
playbook: tj.yaml
[root@master ~]# ansible-playbook tj.yaml 
设置
- hosts: mysql
  remote_user: root
  tasks:
  - name: "shutdown CentOS"    
    command: /sbin/shutdown -h now    关闭系统
    when: ansible_distribution == "CentOS"   当ansible分配系统为CentOS时

多条件判断

[root@master ~]# vi tj.yaml
[root@master ~]# ansible-playbook tj.yaml --syntax-check

playbook: tj.yaml
[root@master ~]# ansible-playbook tj.yaml 


- hosts: mysql
  remote_user: root
  tasks:
  - name: "shutdown CentOS 7 systems"
    command: /sbin/shutdown -h now
    when:                                
    - ansible_distribution == "CentOS"           CentOS系统
    - ansible_distribution_major_version == "7"  系统版本为7
满足以上条件才执行以上模块操作

组条件判断

[root@master ~]# vi tj.yaml
[root@master ~]# ansible-playbook tj.yaml --syntax-check

playbook: tj.yaml
[root@master ~]# ansible-playbook tj.yaml 

- hosts: mysql
  remote_user: root
  tasks:
  - name: "shutdown 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")

迭代

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

for  item(变量) in  with_items(集合)
do
    命令
done
[root@master ~]# vi update.yaml

- hosts: mysql
  remote_user: root
  tasks:
  - name: install apache tomcat
    yum: name={{item}}
    with_items:
      - httpd
      - tomcat

[root@master ~]# ansible-playbook update.yaml --syntax-check

playbook: update.yaml
[root@master ~]# ansible-playbook update.yaml 
[root@master ~]# vi adduser.yaml
[root@master ~]# ansible-playbook adduser.yaml
- hosts: mysql
  remote_user: root
  tasks:
  - name: "Add users"
    user: name={{item.name}} state=present groups={{item.groups}}
    with_items:
     - { name: 'test1',groups: 'pinguo'}
     - { name: 'test2',groups: 'juzi'}

最后

以上就是慈祥冬日为你收集整理的ansible剧本操作YAML概述playbook概述playbook剧本配置条件测试迭代的全部内容,希望文章能够帮你解决ansible剧本操作YAML概述playbook概述playbook剧本配置条件测试迭代所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部