ansible playbook
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible playbook相关的知识,希望对你有一定的参考价值。
playbook实战
1.
下面有一个安装apache的shell脚本,大家来感受一下:
#!/bin/bash
# 安装Apache
yum install --quiet -y httpd httpd-devel
# 复制配置文件
cp /path/to/config/httpd.conf /etc/httpd/conf/httpd.conf
cp /path/to/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf
# 启动Apache,并设置开机启动
service httpd start
chkconfig httpd on
将其转换为一个完整的playbook后:
---
- hosts: all
tasks:
- name: "安装Apache"
command: yum install --quiet -y httpd httpd-devel
- name: "复制配置文件"
command: cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
command: cp /tmp/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf
- name: "启动Apache,并设置开机启动"
command: service httpd start
command: chkconfig httpd on
将以上内容放在一个名为playbook.yml的文件中,直接调用ansible-playbook命令,即可运行,运行结果和脚本运行结果一致:
# ansible-playbook ./playbook.yml
在上述playbook中,我们使用了“command”模块来运行了标准的shell命令。我们还给了每一出play一个“name”,因此当我们运行playbook时,每一个play都会有非常易读的的信息输出:
上面的playbook已经可以很好的运行shell脚本了,但是Ansible还有很多其他内置模块,可以大幅提升处理复杂配置的能力。
--- - hosts: all sudo: yes tasks: - name: 安装Apache yum: name={{ item }} state=present with_items: - httpd - httpd-devel - name: 复制配置文件 copy: src: "{{ item.src }}" dest: "{{ item.dest }}" owner: root group: root mode: 0644 with_items: - { src: "/tmp/httpd.conf", dest: "/etc/httpd/conf/httpd.conf" } - { src: "/tmp/httpd-vhosts.conf", dest: "/etc/httpd/conf/httpd-vhosts.conf" } - name: 检查Apache运行状态,并设置开机启动 service: name=httpd state=started enabled=yes
2 Playbook案例逐行剖析
- 1 第一行,“---”,这个是YAML语法中注释的用法,就像shell脚本中的“#”号一样
- 2 第二行,“- hosts: all”,告诉ansible具体要在哪些主机上运行我的剧本(playbook),在本例中是all,即所有主机
- 3 第三行,“sudo: yes”,告诉ansible通过sudo来运行相应命令,这样所有命令将会以root身份执行
- 4 第四行,“tasks:”,指定一系列将要运行的任务
-
-
- 每一个任务(play)以“- name: 安装Apache”开头。“- name:”字段并不是一个模块,不会执行任务实质性的操作,它只是给“task” 一个易于识别和名称。即便把name字段对应的行完全删除,也不会有任何问题。
- 本例中我们使用yum模块来安装Apache,替代了“yum -y install httpd httpd-devel”
- 在每一个play当中,都可以利用 with_items 来定义变量,并通过“{{ 变量名 }}”的形式来直接使用使用yum模块的state=present选项来确保软件被安装,或者使用state=absent来确保软件被删除
- 第二个任务(play)同样是“- name”字符开头
- 我们使用copy模块来将“src”定义的源文件(必须是ansible所在服务器上的本地文件 )复制到“dest”定义的目的地址(此地址为远程主机的上地址)去,在传递文件的同时,还定义了文件的属主,属组和权限
- 这个play中,我们用数组的形式给变量赋值,使用{var1: value, var2: value} 的格式来赋值,变量的个数可以任意多,不同变量间以逗号分隔,使用{{item.var1 }}的形式来调用变量,本例中为:{{ item.src }}
- 第三个任务(play)使用了同样的结构,调用了service模块,以保证服务的正常开启
-
-
3 Playbook与Shell脚本差异对比
当我们把shell脚本转换为playbook运行的时候,ansible会留下清晰的执行痕迹,明确告诉我们在每一台主机上的每一步都做了什么。
更厉害的是,当我们重复执行一个playbook时,当ansible发现系统的现有状态符合playbook所定义的状态时,anbile将自动跳过该操作。
比如下图,我们再次执行playbook: temp.yml,当ansible发现playbook中的play都已被完成,它将直接返回ok状态码,速度非常之快。
如果是shell脚本,肯定会硬着头皮,把所用操作再做一遍。 -
在正式运行playbook之前,可以使用--check 或 -C 选项来检测playbook都会改变哪些内容,显示的结果跟真正执行时一模一样,但不会真的对被管理的服务器产生影响
3. Ansible-playbook命令详解
-
3.1 限定执行范围
--limit
如果我们运行上面的例子,会发现所有被ansible管理的主机都会被操作。
我们可以通过修改“- hosts:”字段来指定哪些主机将会应用playbook的操作,指定一台主机:www.magedu.com
指定多台主机:www.magedu.com,www.osstep.com
指定一组主机:dbserver当然,也可以直接通过ansible-playbook命令来指定主机:
# ansible-playbook playbook.yml --limit webservers
-
如果想知道在执行playbook时,哪些主机将会受影响,则使用--list-hosts选项:
# ansible-playbook playbook.yml --list-hosts
-
4. Ansible-playbook: 用户与权限设置
--remote-user
Playbook中,如果在与hosts同组的字段中没有定义user,那么Ansible将会使用你在inventory文件中定义的用户,如里inventory文件中也没定义用户,Ansible将默认使用当前系统用户身份来通过SSH连接远程主机,在运程程主机中运行play内容。
我们也可以直接在ansible-playbook中使用 --remote-user选项来指定用户:
# ansible-playbook playbook.yml --remote-user=tom
--ask-sudo-pass
在某些情况下,我们需要传递sudo密码到远程主机,来保证sudo命令的正常运行。这时,可以使用--ask-sudo-pass (-K)选项来交互式的输入密码。
-
--sudo
-
使用--sudo选项,可以强制所有play都使用sudo用户,同时使用--sudo-user选项指定切换到具体哪个用户,如果不指定,则默认以root身份运行。
比如,当前用户Tom想以Jerry的身份运行playbook,命令如下:
$ ansible-playbook playbook.yml --sudo --sudo-user=jerry --ask-sudo-pass
执行过程中,会要求用户输入Jerry的密码。 - Ansible-playbook: 其它选项
Ansible-playbook命令还有一些其他选项:--inventory=PATH (-i PATH):指定inventory文件,默认文件是/etc/ansible/hosts
--verbose(-v):显示详细输出,也可以使用-vvvv显示精确到每分钟的输出
--extra-vars=VARS(-e VARS):定义在playbook使用的变量,格式为:"key=value,key=value"
--forks=NUM ( -f NUM):指定并发执行的任务数,默认为5,根据服务器性能,调大这个值可提高ansible执行效率
--connection=TYPE ( -c TYPE):指定连接远程主机的方式,默认为ssh,设为local时,刚只在本地执行playbook,建议不做修改
--check:检测模式,playbook中定义的所有任务将在每台远程主机上进行检测,但并不直正执行 -
问题1:ansible-playbook 如何收集多台服务器的信息,做统一的汇总report?
-
回问题1: ansible有一个模块叫setup, 直接在命令行运行:ansible all -m setup即可获取所有主机的各种信息,当然该模块也可在playbook中使用
-
以上是关于ansible playbook的主要内容,如果未能解决你的问题,请参考以下文章