playbook基础

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44869242/article/details/91893239

playbook基础

一、基础知识
1.ansible七种武器
• 第一种武器
  – ansible 命令,用于执行临时性的工作,必须掌握
• 第二种武器
  – ansible-doc是ansible模块的文档说明,针对每个模块都有详细的说明及应用案例介绍,功能和Linux系统man命令类似,必须掌握
• 第三种武器
  – ansible-console是ansible为用户提供的交互式工具,用户可以在ansible-console虚拟出来的终端上像Shell一样使用ansible内置的各种命令,这为习惯使用Shell交互方式的用户提供了良好的使用体验
• 第四种武器
  – ansible-galaxy从github上下载管理Roles的一款工具,与python的pip类似
• 第五种武器
  – ansible-playbook是日常应用中使用频率最高的命令,工作机制:通过读取先编写好的playbook文件实现批量管理,可以理解为按一定条件组成的ansible任务集,必须掌握
• 第六种武器
  – ansible-vault主要用于配置文件加密,如编写的playbook文件中包含敏感信息,不想其他人随意查看,可用它加密解密这个文件
• 第七种武器
  – ansible-pull
  – ansible有两种工作模式pull/push ,默认使用push模式工作,pull和push工作模式机制刚好相反
  – 适用场景:有大批量机器需要配置,即便使用高并发线程依旧要花费很多时间
  – 通常在配置大批量机器的场景下使用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻性规划有较高要求

2.JSON简介
JSON文件格式
 简介: JSON是JavaScript对象表示法,它是一种基于文本独立于语言的轻量级数据交换格式
JSON中的分隔符限于
单引号" ’ " 双引号 " ’ " 用来规划一个数据值
小括号 " () " 分组使用
中括号 " [ ] " 定义一个数组,用逗号分隔 [ “k1”:“v1” , “k2” , “kn” ]
大括号 " { } " 多个键值对,用逗号分隔 { “k1”:“v1” , “k2”:“v3” , “kn”:“vn” }
冒号 " : " 一个键值对,
逗号 " , " 分隔数据用的
注意: 空格是没有限制要求的,写不写都一样,空格不算一个分隔符号。
如果想让空格成为一个字符,要用\转义,也就是 “\ " 代表一串空格字符。
JSON由简到繁的演变过程
++++++++++++++++++++++++++++++++++++++++++++
3.YAML简介
实质是: 用来表达数据序列的格式
基础语法:
1. YAML的结构通过空格来展示,不使用逗号!
2. 数组使用”- “来表示,注意是 减号空格
3. 键值对使用”: "来表示,注意是 冒号空格
4. YAML使用一个固定的缩进风格表示数据层级结构关系
5. 一般每个缩进级别由两个以上空格组成
6. 使用 # 表示注释
注意:
不要使用tab,缩进是初学者容易出错的地方之一
同一层级缩进必须对齐
开头需要写 — 表示文件开始
例:

---
- hosts: all
  remote_user: root
  tasks:
	- name: install the latest version of Apache
  	  yum:
   	    name: httpd
   	    state: installed
	- service:
        name: httpd
        state: started
        enabled: yes 
    - lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^Listen 80'
        line: 'Listen 8080'
    - copy:
        src: /var/www/html/index.html
        dest: /var/www/html/index.html
        owner: apache
        group: apache
        mode: 0644

4.Jinja2模版简介
模版基本语法
1. 模板的表达式都是包含在分隔符"{{ }}“内的
2. 控制语句都是包含在分隔符”{% %}“内的
3. 模板支持注释,都是包含在分隔符”{# #}" 内,支持块注释
4. 调用变量{{变量名}}
5. 计算{{数值1 运算符号 数值2}},例如{{1*2}}
6. 可以使用过滤器进行修改,和Shell一样,使用符号 |
***************************************
**

二、playbook

1.playbook是什么
核心元素:
Tasks:任务,由模块定义的操作的列表;
Variables:变量
Templates:模板,即使用了模板语法的文本文件;
Handlers:由特定条件触发的Tasks;
Roles:角色;
playbook的基础组件:
Hosts:运行指定任务的目标主机;
remote_user:在远程主机以哪个用户身份执行;
sudo_user:非管理员需要拥有sudo权限;
tasks:任务列表

2.playbook语法基础

语法进阶
•变量[vars:]

---
- hosts: cache
  remote_user: root
  vars:
  username: li
  pwd: 123a
  tasks:
- name: create user "{{username}}"
  user:
    name: "{{username}}"
    password: "{{pwd|password_hash('sha512')}}"

变量参数
  – 传递参数
  – -e 参数
  – 参数格式必须是 json 或 yaml
  – yaml 格式 可以使用参数文件,例如
  – args.yml

---
username:
nb

– -e @args.yml

]# ansible-playbook user01.yml -e '{"username":"plj","pwd":"123qqq...a"}'
]# ansible-playbook user01.yml -e @aa.yml

•error
ansible-playbook对错误的处理
  – 默认情况判断$?,如果值不为0就停止执行
  – 但某些情况我们需要忽略错误继续执行
例:

---
- hosts: cache
  remote_user: root
  tasks:
    - shell: mkdir /mnt/cache2
      ignore_errors: True

•handlers
由特定条件触发的Tasks;
当关注的资源发生变化时采取的操作
notify这个action可用于在每个play的最后被触发,这样可以避免有多次改变发生时每次都执行指定的操
作,取而代之仅在所有的变化发生完成后一次性地执行指定操作
在notify中列出的操作称为handler,即notify调用handler中定义的操作
例:
修改httpd的配置文件,重新载入配置文件让服务生效

- hosts: web
  remote_user: root
  tasks:
    - copy:
      src: httpd.conf
      dest: /etc/httpd/conf/httpd.conf
      owner: root
      group: root
      mode: 0644
      tags: httpconf
    notify:
      - restart httpd
  handlers:
    - name: restart httpd
      service:
        name: httpd
        state: restarted

•when
 有些时候需要在满足特定的条件后再触发某一项操作,或在特定的条件下终止某个行为,这个时候需要进行条件判断,when正是解决这个问题的最佳选择,远程中的系统变量facts作为when的条件,可以通过setup模块查看
例:

- hosts: web
  remote_user: root
  tasks:
	- shell: uptime |awk '{printf("%.2f",$(NF-2))}'
  	  register: result
	- service:
    	name: httpd
    	state: stopped
  	  when: result.stdout|float > 0.7

•register
  – 有时候我们还需要更复杂的例子,如判断前一个命令的执行结果去处理后面的操作,这时候就需要register模块来保存前一个命令的返回状态,在后面进行调用

•with_items
 with_items是playbook标准循环,可以用于迭代一个列表或字典,通过{{ item }}获取每次迭代的值
例:
  为不同用户定义不同组

- hosts: web2
  remote_user: root
tasks:
  - name: add users
  	user:
      group: "{{item.group}}"
      name: "{{item.name}}"
      password: "{{item.pwd|password_hash('sha512')}}"
    with_items:
      -
        name: nb
        group: root
        pwd: dc
      -
        name: yang
        group: man
        pwd: lg
     -
        name: liu
        group: ftp
        pwd: '6'

•tags
tags:给指定的任务定义一个调用标识
 使用格式:
  – name: NAME
  – module: arguments
  – tags: TAG_ID
 playbook 调用方式
  – -t TAGS, --tags=TAGS
  – --skip-tags=SKIP_TAGS
  – --start-at-task=START_AT
例:

- hosts: cache
  remote_user: root
  tasks:
  - copy:
      src: httpd.conf
      dest: /etc/httpd/conf/httpd.conf
      owner: apache
      group: apache
      mode: 0644
  - copy:
      src: index.html
      dest: /var/www/html/index.html
      owner: apache
      group: apache
      mode: 0644
    tags: syncconf

猜你喜欢

转载自blog.csdn.net/qq_44869242/article/details/91893239
今日推荐