Ansible进阶

ansible的7中工具

必须掌握前三种

ansible命令

用于执行零时性的工作
ansible 主机名或分组名 -m 模块名 -a 模块参数

ansible-doc

是ansible模块的文档说明,针对每个模块都有详细的说明及应用案例介绍,功能和Linux系统man命令相似.
ansible-doc 模块名称

ansible-playbook

是日常应用中使用频率最高的命令,工作机制:通过读取先编写好的playbook文件事先批量管理,可以理解为按一定条件组成的ansible任务集.

ansible-console

是ansible为用户提供的交互式工具,用户可以再ansible-console虚拟出来的终端上像shell一样使用ansible内置的各种命令.

ansible-galaxy

从github上下载管理Roles的一款工具,与python的匹配类似.

ansible-vault

主要用于配置文件加密,编写的playbook文件中包含敏感信息,不像其他人随意查看,可用它加密/解密这个文件.

ansible-pull

ansible工作有两种模式,pull/push,默认使用push模式工作,两者工作模式机制相反.
push是将信息及时的推送给机器,灵活度高
pull是等机器过来取信息,使用大批量机器需要配置,及时使用高并发线程依旧要花费很多时间的场景,通常在配置大批量机器的场景下使用,灵活性稍有欠缺,但效率可以无线提升.

JSON介绍

  • 是JavaScript对象表示发,是一种基于文本,独立于语言的轻量级数据交换格式.
  • 基于文本:字符串类型
  • 独立于语言:不依赖任何编程语言
  • 数据交换格式:有自己的一套语法格式
  • 分隔符限于单引号’ 小括号() 中括号[] 大括号{} 冒号: 逗号,

特性

  • JSON是纯文本
  • 具有自我描述性
  • 具有层级结构
  • 可通过JavaScript进行解析

语法规则

  • 数据在名称/值(键值对)中;
  • 数据有逗号分隔;
  • 大括号{}保存对象(键值对);
  • 中括号[]保存数组

数据书写格式

  • 键值对(名称/值)包括字段名称(在双引号中),后面写一个冒号,然后是值
    “姓名”: “李四”
  • 数组表示方法
{ “住户”: 
			[ “李四”,”王五”,”马六” ]
}
符合复杂类型
{ “住户”:
		[
		 {“姓名”: “李四”,”籍贯”: “陕西”},
		 {“姓名”: “王五”,”籍贯”: “山西”},
	     {“姓名”: “马六”,”籍贯”: “甘肃”}
		]
}

技巧: 找成对出现的{}和[].{}里面的一定是键值对,[]一定是数组.

YAML简介

可读性高,用来表达数据序列的格式

基础语法

  • YAML的结构通过空格来展示
  • 数组使用”- “(-空格)来表示
  • 键值对使用”: ”(:空格)来表示
  • 使用固定的缩进风格表示数据层级结构关系
  • 每个缩进级别有两个以上空格组成
  • #表示注释
  • 注意:编写YAML不要使用tab缩进;同一层级缩进必须对齐

键值表示方法

  • 采用冒号分隔,冒号后面必须有一个空格
“姓名”: “张三”
“姓名”:
   “张三”
  • 复杂的YMAL的键值对嵌套
“住户”:
  “姓名”: “张三”
“住户”:
   “姓名”: 
     “张三”
  • 数组表示方法
    使用一个横杠加一个空格来表示
- “张三”
- “李四”
- ”王五”

哈希数组符合表达式

“姓名”:
  - “张三”
  - “李四”
  - ”王五”
  • 复合表达式
“住户”:
- 
  “姓名”: “李四”
  ”籍贯”: “陕西”
- 
  “姓名”: “王五”
  ”籍贯”: “山西”
- 
  “姓名”: “马六”
  ”籍贯”: “甘肃”

Jinja2模板介绍

Jinja2是基于Python的模板引擎,包含变量和表达式两部分,两者在模板求值时会被替换为值,模板中还有标签,控制模板的逻辑.
playbook的模板使用Python的Jinja2木块来处理

基本语法

  • 模板的表达是都是包含在分隔符”{{ }}”内
  • 控制语句都是包含在分隔符”{% %}”内
  • 模板支持注释,都是包含在分隔符”{# #}”内,支持块注释
  • 调用变量
    {{var_name}}
  • 计算
    {{2+3}}
  • 判断
    {{1 in [1,2,3]}}
  • 控制语句
    {% if name == ‘str1’ %}
  • 语句1
    {% elif name == ‘str2’ %}
  • 语句2
    {% else %}
  • 语句3
    {% endif %}

Jinja2过滤器

变量可以通过过滤器修改,过滤器与变量用管道符号(|)分割,也可用圆括号传递可选参数,多个过滤器可以链式调用,前一个过滤器的输出会被作为后一个过滤器的输入
例如加密一个字符串:{{‘astr’|password_hash(‘sha512’)}}
过滤器在线文档http://docs.jinkan.org/docs/jinja2/templates.html

playbook

playbook是ansible用于配置,部署和管理托管主机的剧本,通过playbook的详细描述,执行其中的一系列的tasks,可以让远端主机达到预期状态.playbook可以反复使用编写的代码,可以放到不同的机器上面,像函数一样,最大化的利用代码,在使用ansible的过程中,处理的大部分操作都是在编写playbook.

playbook语法基础

playbook有YAML语言编写,遵循YAML标准
在同一行中,#之后的内容表示注释
同一列表中的元素应该保持相同的缩进
playbook有一个或多个play组成
play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以”: ”分隔表示
YAML的文件开始都应该是—,这是YAML格式的一部分,表明一个文件的开始.

playbook构成

hosts:定义将要执行playbook的远程主机组
vars:定义playbook运行时需要使用的变量
tasks:定义将要在远程主机上执行的任务列表
handlers:定义task执行完成以后需要调用的任务

playbook执行结果

使用ansible-playbook运行playbook文件,输出内容为JSON格式,有不同颜色组成便于识别
绿色代表执行成功;***代表系统状态发生改变:红色代表执行失败

vim ping.yaml
---
- hosts: all  #主机集合
  remote_user: root
  tasks:		#命令集合
    - ping:
  • ansible-playbook ping.yaml
  • hosts:主机集合,定义要执行任务的主机,内容是一个(多个)组或主机的patterns,以逗号分隔
  • tasks:命令集合,每一个playbook包含了一个task列表(任务列表),一个task在其所对应的所有主机上(通过hosts_pattern匹配的所有主机)执行完毕之后,下一个task才会执行.
  • 示例:给web主机添加用户z3,设置密码为123,并将z3用户添加到users组
- hosts: web
  remote_user: root
  tasks: 
- user:
    name: z3
    group: users
- shell: echo 123 | passwd --stdin z3

练习:给所有web主机安装Apache,修改配置文件的监听端口为8080,设置默认主页helloworld,启动服务并是指开机自启动.

---
- hosts: web
  tasks:
    - name: install the latest version of Apache
      yum:
        name: httpd
        state: installed
    - lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^Listen 80$'
        line: 'Listen 8080'
    - copy:
        src: index.html
        dest: /var/www/html/
    - service:
        name: httpd
        enabled: yes
    - service:
        name: httpd
        state: restarted

变量

示例: 添加用户l4,设置默认密码123

---
- hosts: web
  remote_user: root
  vars:
    uname: l4
  tasks:
    - user:
        name: “{{uname}}”
    - shell: echo 123 | passwd --stdin “{{uname}}”
  • 通过变量设置密码
    使用变量过滤器password_hash,password模块是把字符串直接写入到shadow,并没有改变,但是Linux的shadow密码是经过加密的,所以不能使用明文,要经过sha512算法加密
    password: “{{“密码” | password_hash(‘sha512’)}}”
    password_hash(‘算法’),算法必须用单引号括起来

  • 变量参数
    变量不直接在文件中定义,也可以使用ansible-playbook命令时进行传递
    传递的变量参数格式必须是json或yaml
    传递参数方式一: ansible-playbook name.yml -e {{变量: 值}}
    也可以传递参数文件,但是在参数文件的格式是yaml格式,其中定义了参数和对应的值
    传递参数方式二: ansible-playbook name.yml -e @args.yml

  • error

    • 错误处理机制
      ansible-playbook默认情况判断$?,如果值为0就停止执行,但某些情况下我们需要忽略错误继续执行,以提高playbook的重复利用性.例如装机时创建的缓存目录,并拷贝文件,后期维护只需要拷贝功能,那么playbook中的创建目录的语句执行时会报错.
    • 错误处理的方法
      使用ignore_errors:对错误进行处理
      ignore_errors: Ture 表示忽略错误继续执行
      ignore_errors: False 表示遇到错误就停止执行
      默认是False
    • 示例:
- name: run command
  shell: /usr/bin/某些命令
  ignore_errors: Ture
  • tags
    tags:给指定的任务定义一个调用标示
    使用格式:
- 模式: 模式对应的命令参数
- tags: 标示ID
调用: ansible-playbook name.yml -t 标示ID
    只执行标示ID对应的命令
  • handlers
    当关注的资源发生变化时采取的操作
    notify这个action可用于在每个play的最后被触发,这样可以避免有多次改变发生时每次都执行指定的操作,取而代之今犹在所有的变化发生完成后一次性的执行指定操作
    notify中列出的操作成为handlers,机notify调用handlers中定义的操作.
    示例:复制配置文件,触发重启服务
vim httpd.yml(yaml)
---
- hosts: web
  tasks: 
    - copy: 
        src: httpd.conf
        dest: /etc/httpd.conf.httpd
        tags: copyconf
  notify:
    - restart httpd
 	    handlers:
    - name: restart httpd
      service:
        name: httpd
        state: restarted
]# ansible-playbook httpd.yml -t copyconf

**注意事项:**notify调用的是handler段中name定义的串,必须一致,否则达不到触发效果;多个task触发同一个notify时,同一个服务只会触发一次;notify可以触发多个条件,在生产环境中往往涉及到某一个配置文件的改变要重启若干服务的场景,handler就非常合适了,结合vars可以写出非常普适的服务管理脚本.

  • when
    有时需要在满足特定条件后再触发某项操作,或是在特定条件下终止某个行为,这时候就需要用到条件判断,when可以解决这个问题,远程系统变量facts作为when的条件,可以通过setup模块查看(ansible 主机名 -m setup)
    • 示例:
tasks:
  - name: 描述
    模块名: 参数命令
    when: 触发条件
  • register
    在复杂环境中,需要判断前一个命令的执行结果去处理后面的操作,这时候需要register模块来保存前一个命令的返回状态,在后面进行调用.
    示例: 当系统的负载大于0.7的时候,重启web服务器的httpd服务
---
- hosts: web
 remote_user: root
 tasks:
   - shell: uptime | awk ‘{printf (“%.2f”,$(NF-2))}’ 
 register: result
               - service: 
                 name: httpd
                 state: restarted
 when: result.stdout|float > 0.7 
 
其中 uptime | awk ‘{printf (“%.2f”,$(NF-2))}’ 使用awk截取系统的1分钟内的负载值,printf是标准输出格式,支持传递参数.”%.2f”是设置为浮点型,保留小数点后两位数.
result.stdout|float :result.stdout是result的标准输出,默认输出为字符串,需要强制转化为浮点型数据,方便与参数比较.
with_items
是playbook的标准循环,可以用于迭代一个列表活字典,通过{{item(固定就为这个变量名)}}获取每次迭代的值.
  • 示例: 创建多个用户
---
- hosts: web1
  remote_user: root
  tasks: 
            - user:
                name: “{{item}}”
                group=adm
                password={{‘123456’|password_hash(‘sha512’)}}
                with_items: [“z3”,”l4”,”w5”]

示例: 为不同的用户创建不同的组

---
- hosts: web1
  remote_user: root
  tasks: 
            - user:
                name: “{{item.name}}”
                group={{item.grp}}
                password={{‘123456’|password_hash(‘sha512’)}}
                with_items: 
                  - {name: “z3”, grp: “adm”}
                  - {name: ”l4”, grp: “mysql”}
                  - {name: ”w5”, grp: “nginx”}

技巧方法:
在编写playbook的时候随着项目越做越大,可以把一些play/task或handler放到其他文件中,通过include指令包含进来.

tasks:
      - include: tasks/setup.yml
      - include: tasks/users.yml
handlers: 
  - include: handlers/handlers.yml
  • 调试
    • 检测语法
      ansible-playbook --syntax-check playbook.yml
    • 测试运行
      ansible-playbook -C playbook.yml
    • 显示受影响的主机
      ansible-play xxx.yml --list-hosts
    • 显示工作的task
      ansible-play xxx.yml --list-tasks
    • 显示将要运行的tag
      ansible-play xxx.yml --list-tags
    • debug
      debug模块可以在运行是输出更为详细的信息,帮助排错
---
- 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.8
   	 - debug: var=result
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值