Linux中级之ansible配置(playbook)
一、playbooks
如果用模块形式一般有幂等性,如果用shell或者command没有幂等性
playbooks相当于是shell脚本,可以把要执行的任务写到文件当中,一次执行,方便调用
tasks:一个task相当于是一个play
varibles:变量,一定定义,多处调用
template:模板,可以区分不同主机的特点
handlers:触发器,依赖于前一个任务,前一个任务如果执行改变,那么就会触发handlers
二、yaml介绍及格式
yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括:xml,c语言,python,perl以及电子邮件格式RFC2822等,ClarkEvans在2001年在首次发表了这种语言。
特点:
(1)yaml的可读性好
(2)yaml和脚本语言的交互性好
(3)yaml使用实现语言的数据类型
(4)yaml有一个一致的信息模型
(5)yaml易于实现
(6)yaml可以基于流程来处理
(7)yaml表达能力强,扩展性好
编写说明:
(1)缩进:yaml 的缩进要求比较严格。一定不能使用tab键
(2)冒号:每个冒号后面一定要有一个空格
注意:1. 以冒号结尾不需要空格
2. 表示文件路径的模版可以不需要空格
(3)短横线-:想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分
注意:
1. 严格控制空格编写剧本的时候
2. 剧本编写不支持tab
书写规范注意点:
1、脚本名:***.yml 【不是.yml也行】
2、注释: “#”
3、tasks: (后不能加任何字符-可以加注释#)
4、- name: 一个 - name: 下不能有两条功能(行)
.每个-和:即冒号之后要有一个空格,task除外。
剧本格式:
--- ### 剧本的开头,可以不写
- hosts: all <- 处理所有服务器,找到所有服务器; -(空格)hosts:(空格)all
tasks: <- 剧本所要干的事情; (空格)(空格)task:
- command: (空格)(空格)-(空格)模块名称:(空格)模块中对应的功能
测试剧本命令后面可以跟多个-v进行调试检查
常用命令:
1、对剧本语法检测
ansible-playbook --syntax-check /root/ansible/httpd.yaml
2、-C模拟执行剧本
ansible-playbook -C /root/ansible/httpd.yaml
3、执行剧本
ansible-playbook /root/ansible/httpd.yaml
三、ansible剧本实例
实例一:基础(编写一个rehttpd.yaml剧本)
第一步:编写剧本
[root@ren5 ~]# vim rehttpd.yaml
1 - hosts: test_ren1
2 remote_user: root
3 tasks:
4 - name: copy httpd.conf
5 copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
6 - name: restart httpd
7 service: name=httpd state=restarted
第二步:语法检测
[root@ren5 ~]# ansible-playbook --syntax-check rehttpd.yaml
playbook: rehttpd.yaml
第三步:模拟执行剧本
[root@ren5 ~]# ansible-playbook -C rehttpd.yaml
第四步:真正执行剧本
[root@ren5 ~]# ansible-playbook rehttpd.yaml
第五步:检查是否已经启动成功
[root@ren5 ~]# ansible test_ren1 -m shell -a "ss -tnl |grep 80"
实例二:打标签
-t:执行指定tag标签任务
--skip-tags:执行--skip-tags以外的任务
执行:ansible-playbook xxx.yaml -t TAG
ansible-playbook xxx.yaml --skip-tags TAG
定义带tag标签的yaml文件:
1 - hosts: test_ren1
2 remote_user: root
3 tasks:
4 - name: "touch 123.txt"
5 shell: echo {{ ansible_all_ipv4_addresses }} > 123.txt
6 tags:
7 - tag1
8 - name: "date"
9 shell: date >> 123.txt
10 tags:
11 - tag2
12 - tag3
[root@ren5 ~]# ansible-playbook tag.yaml -t tag1 #只执行tag1标签的任务
[root@ren5 ~]# ansible all -a "cat 123.txt" #查看文件内容
实例三:include
include:如果有多个任务要执行,写在一个yaml文件里就显得太臃肿了,而且阅读性也比较低,这个时候可以用include关键字把多个任务联合到1个yaml文件里,方便调用
比如有2个文件,a.yaml和b.yaml,那么我们可以把a.yaml,b.yaml联合到一个exec.yaml文件中执行
a.yaml的内容如下:
1 - name: "touch abc.txt"
2 shell: echo 'hello' >> abc.txt
b.yaml的内容如下:
1 - name: "touch abc.txt"
2 shell: echo 'world' >> abc.txt
exec.yaml的内容如下:
1 - hosts: test_ren1
2 remote_user: root
3 tasks:
4 - include_tasks: a.yaml
5 - include_tasks: b.yaml
[root@ren5 ~]# ansible-playbook --syntax-check exec.yaml
[root@ren5 ~]# ansible-playbook exec.yaml
[root@ren5 ~]# ansible test_ren1 -m shell -a "cat abc.txt"
实例四:剧本中使用变量
变量的引用:{{变量名}}
一、自定义变量的实现方式:
第一种:直接写在yaml文件中,在文件中声明变量(声明变量只需要声明1次,定义变量可以定义多次)
vars和tasks同级,并要写在tasks前面
vars:
- 变量名: 变量值
vars:
- file: httpd.conf #file就是一个变量
1 - hosts: 192.168.11.4
2 remote_user: root
3 vars:
4 - packages: tree
5 tasks:
6 - name: yum install tree
7 yum: name={{ packages }} state=present
第二种:在inventory file文件中定义
vim /etc/ansible/hosts #定义主机组
[test_ren1:vars]
file=httpd.conf #变量名=变量值
packages=tree #file和packages是两个变量
第三种:执行playbook文件时候给与变量 --extra-vars
ansible-playbook test.yaml --extra-vars "touch_file=test.txt" #--extra-vars可以出现一次或者多次
二、注册变量
register注册变量:把date命令输出的结果赋予给date_output
1 - hosts: 192.168.254.10
2 remote_user: root
3 tasks:
4 - name: get date
5 command: date
6 register: date_output
7 - name: echo date_output
8 shell: "echo {{date_output.stdout}}>/tmp/a.txt"
1 ---
2 - hosts: test1
3 remote_user: root
4 tasks:
5 - name: get users_info
6 command: "tail /etc/passwd"
7 register: users_info
8 - name: echo users_info
9 shell: "echo '{{ users_info.stdout }}' > /root/ab.txt"
#若变量值(变量内容)包含较多内容时,需用引号引起来
实例五、剧本中使用判断
剧本中可以使用when来进行判断
when条件语句:可以根据setup显示出客户端信息为依据来判断
1、根据系统信息判断
1 ---
2 - hosts: test_ren1
3 remote_user: root
4 tasks:
5 - name: touch file
6 shell: "touch /tmp/a.txt"
7 when: ansible_distribution=='CentOS' and ansible_distribution_major_version=='8'
2、根据域名判断
第一步:查看主机的域名(ansible_fqdn是一个变量)
[root@ren5 ~]# ansible 192.168.11.4 -m setup |grep ansible_fqdn
"ansible_fqdn": "ren4",
第二步:编写剧本
在编写剧本的时候ren4即主机名需要加上双引号或者单引号,否则会报错
1 ---
2 - hosts: all
3 tasks:
4 - name: useradd liqin
5 user: name=liqin uid=1210 system=yes
6 when: ansible_fqdn == "ren4"
第三步:语法检测
[root@ren5 ~]# ansible-playbook --syntax-check name.yaml
第四步:模拟执行
[root@ren5 ~]# ansible-playbook -C name.yaml
实例六:剧本中使用循环(迭代)
剧本中的循环使用with_items,使用item引用变量(item不可变)
变量的引用格式是 {{ item }}
第一种:
1 ---
2 - hosts: 192.168.11.6
3 remote_user: root
4 tasks:
5 - name: add many users
6 user: name={{ item }} state=present
7 with_items:
8 - user01
9 - user02
10 - uesr11
11 - user12
第二种:Key-Value,键值对的形式实现了传多个变量的需求
1 ---
2 - hosts: 192.168.11.6
3 remote_user: root
4 tasks:
5 - name: add many users
6 user: name={{ item.name }} groups={{ item.groups }} state=present
7 with_items:
8 - { name: 'testuser1', groups: 'root' }
9 - { name: 'testuser2', groups: 'ren6' }
实例七:异常处理
ignore_errors:如果任务出错,直接跳过,不会影响其他任务
1 ---
2 - hosts: 192.168.11.4
3 remote_user: root
4 tasks:
5 - name: error
6 command: make a.txt
7 ignore_errors: yes
实例八:使用处理器(触发器)notify
handlers:如果执行的任务被改变那么会触发handlers的任务,notify下面的 - 引导的列表可以为一个或者多个,类似于流程控制语句
剧本说明:
- hosts: all 指定主机组,可以理解为这个最大,顶个写
tasks: 指定下面一系列的动作,这个是第二,需要有两个空格
- name: 指定名称,排行第三,需要有三到四个空格
yum: 模块名 排行第四,需要有四到五个空格
notify:
- name: 和handlers下面的name名称对应
handlers:指定处理器(触发器),排行第二,需要与tasks对齐,必须写在最后
1 ---
2 - hosts: test_ren1
3 remote_user: root
4 tasks:
5 - name: copy httpd.conf
6 copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
7 notify:
8 - restarted httpd service
9 handlers:
10 - name: restarted httpd service
11 service: name=httpd state=restarted
执行过程中间有一步RUNNING HANDLER,说明已经触发了处理器进行了重启操作
1 ---
2 - hosts: test1
3 remote_user: root
4 tasks:
5 - name: get users_info
6 command: "tail /etc/passwd"
7 register: users_info
8 notify: #执行多次获报错,可使用触发器或者ignore_errors
9 - echo users_info
10 handlers:
11 - name: echo users_info
12 shell: "echo '{{ users_info.stdout }}' > /root/a.txt"
实例九:模板拷贝(templates)
template,用来区分不同客户端上的特性
1.copy模块替换成template(template本身就有copy的作用,也可以识别变量)
vim test.yaml
1 ---
2 - hosts: test1
3 remote_user: root
4 tasks:
5 - name: copy httpd.conf
6 template: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
7 notify:
8 - restarted httpd service
9 handlers:
10 - name: restarted httpd service
11 service: name=httpd state=restarted
2.vim httpd.conf编辑要拷贝的文件,把不同的地方定义成变量形式{{变量名}}
vim /etc/httpd/conf/httpd.conf
1 42 Listen {{ port }}
3.vim /etc/ansible/hosts 在主机后面定义变量的值:变量名=变量值
1 [test1]
2 192.168.11.5 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 port=81
3 192.168.11.4 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 port=82
ansible-playbook test.yaml,执行后查看结果
[root@ren6 ~]# ansible all -m shell -a "ss -tnl"
192.168.11.4 | CHANGED | rc=0 >>
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::82 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::* 192.168.11.5 | CHANGED | rc=0 >>
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::81 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
Linux中级之ansible配置(playbook)的更多相关文章
- linux中级之ansible配置(roles)
一.roles介绍 什么情况下用到roles? 假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务器.我们如何来定义playbook? 第 ...
- Linux中级之ansible概念及hoc命令行调用模式
一.Ansible简介 ansible是新出现的开源的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统 ...
- linux中级之lvs配置(命令)
一.nat模式配置 环境说明: DS:nat网卡(自动获取也可以,充当vip): 192.168.254.13 255.255.255.0 vmnet3网卡(仅主机): 172.16.100.1 25 ...
- Linux中级之keepalived配置
hacmp: ibm的高可用集群软件,并且是商业的(收费),一般用于非x86架构机器当中 AIX,Unix 去IOE:ibm,oracle,emckeepalived: 一款高可用集群软件,利用vrr ...
- Linux系统实现ansible自动化安装配置httpd
1.使用ansible的playbook实现自动化安装httpd 1)首先配置好ansible的hosts文件,让其对应主机能够受ansible控制 提示:我们在主机清单上配置了所管控的主机地址,但是 ...
- Ansible进阶--playbook的使用
一.什么是playbooksplaybooks是ansible的脚本.如同shell脚本一样,它是控制远程主机的一系列命令的集合,通过YAML语言编写.执行一些简单的任务,我们可以使用ad-hoc命令 ...
- Ansible之playbook的使用总结 - 运维笔记
之前详细介绍了Ansible的安装, 配置, 以及Ansible常用模块的使用. 下面对Ansible的playbook用法做一小结. 为什么引入playbook?一般运维人员完成一个任务, 比如安装 ...
- 在CentOS7.6上安装自动化运维工具Ansible以及playbook案例实操
前言 Ansible是一款优秀的自动化IT运维工具,具有远程安装.远程部署应用.远程管理能力,支持Windows.Linux.Unix.macOS和大型机等多种操作系统. 下面就以CentOS 7.6 ...
- 自动化运维工具——ansible剧本playbook(三)
一.Playbook--Ansible剧本 playbook是由一个或多个 "play"组成的列表 play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的ta ...
随机推荐
- 对不起,“下一代ERP”仍旧是现在的ERP
最近数字化转型太火了,到处都是相关数字化的网文.很多人又说在数字化转型时代,ERP早就落伍了云云,取而代之的是什么"下一代ERP",叫什么"ARP"." ...
- lustre文件系统环境搭建及测试
目录 1.节点角色 2.硬件配置 3.软件版本 4.安装软件包 4.1.安装 e2fsprogs 相关包 4.2.安装 kernel 相关包 4.3.客户端安装 4.4.服务器端安装 4.5.配置 5 ...
- redis的持久化有哪几种方式?不同的持久化机制都有什么优缺点?(偏难)
1.RDB和AOF两种持久化机制的介绍 RDB持久化机制,对redis中的数据执行周期性的持久化 AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的 ...
- (二十)VMware Harbor - API
可以用swagger在线解析 http://editor.swagger.io/将swagger.yaml中的内容拷贝到里面即可. 官方文档说明链接如下:https://github.com/vmwa ...
- JMeter线程组编辑区揭秘
线程组编辑区如下: 有点复杂,但是慢慢看下来,还是比较容易理解. Name 带有业务含义的名字. Comments 线程组的备注说明. Action to be taken after a Sampl ...
- Python数据类型之字符串类型
字符串的表示 字符串是Python中最常用的数据类型之一,必须使用成对的引号包围来表示字符串,引号可以是单引号 ' .双引号 " .三引号''' """,格式如 ...
- 织梦seo
建站-->采集文章-->sitemap-->robots->百度提交链接(主推和自动结合)-->后续优化 http://jingyan.baidu.com/article ...
- hdu4772 水模拟
题意: 给你两个矩阵,问你两个矩阵的最大相同元素个数(位置也要求相同),矩阵可以90旋转多次. 思路: 水题,直接模拟就行了,方法很多,可以直接写坐标关系,或者一层一层处理,就 ...
- XCTF-FlatScience
FlatScience 题目描述 啥描述也没有 解题过程 页面有好多链接,除了论文pdf之外,还有子目录下的index.html, 比如:/1/index.html,/1/3/index.html 扫 ...
- SQL注入注释符(#、-- 、/**/)使用条件及其他注释方式的探索
以MySQL为例,首先我们知道mysql注释符有#.-- (后面有空格)./**/三种,在SQL注入中经常用到,但是不一定都适用.笔者在sqlilabs通关过程中就遇到不同场景用的注释符不同,这让我很 ...