概述
文章目录
- 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 1月 13 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剧本配置条件测试迭代所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复