一、PlayBook简介
1.Ansible的任务配置文件被称为playbook,每一个剧本中包含一系列的任务,每个任务在ansible中又被称为戏剧play
2.语法简介
playbook采用yaml语法(标记语言)编写,该语法的特性:
以"---"3个减号开始且需要顶行首写
区分大小写且一个完整的代码块包括name:task
一个name只能包括一个task
3.shell脚本和palybook的转换
如下图示例:
通过 ansible-playbook ./playbook.yml来运行,其中使用command模块运行标准的shell命令并且为了易读性给每一个play一个name
4.playbook和shell脚本的差异
ansible会在运行时留下痕迹,明确告诉我们每一台主机上的每一步都在做什么
当ansible发现系统的现有状态与playbook所定义的将要实现的状态一致会自动跳过该操作
再次执行playbook时,ansible会发现所有的play都已经完成将直接返回ok状态,shell会重做一遍
在正式执行playbook时可以使用--check或者-C来检测playbook会改变哪些内容
5.限定执行范围
当指定一批主机中个别主机需要进行变更时无需修改playbook文件本身,可以通过一些选项直接限定和查看ansible命令的执行范围
例如:ansible-playbook playbook.yml --limit webserver
如果playbook中设定的时"host:all",但仅对webserver生效
ansible-playbook playbook.yml --list-hosts
上述命令可以查看哪些主机将会受影响
6.用户与权限设置
在playbook中如果hosts字段下没有定义users关键字,ansible将会使用inventory文件中定义的用户,如果该文件中也没有定义用户,ansible将默认使用当前系统用户身份通过ssh远程来连接主机,在主机中运行play内容
ansible-playbook playbook.yml --remote-user=tom
ansible-playbook playbook.yml --sudo --sudo-user=jerry --ask-sudo-pass
上段命令是当前用户以jerry用户的身份运行playbook,并且在执行过程中要求输入jerry的密码
二、Ansible部署tomcat
1.定义变量并设置Handlers
在playbook开头处先引入用于独立保存和定义变量的变量文件vars.yml,命名其为vars.yml,并且定义在和playbook.yml相同的目录下,其中的内容定义为:
#软件包下载路径
download_dir: /tmp
#tomcat版本号
tomcat_version: 8.0.35
#tomcat安装路径
tomcat_dir: /opt/tomcat
#solr安装路径
solr_dir: /opt/solr
#solr版本号
solr_version: 6.1.0
上述配置文件中solr是一种高效可扩展的企业应用服务器附带基于http的管理界面
定义用于触发式启动的tomcat的handlers
handlers:
-name: start tomcat
command: >
initctlstart tomcat
3.将用来管理tomcat的upstart脚本 tomcat.conf放在被管理主机的/etc/init目录下面
3.安装java
上述示例中的java.sh是用来定义java的运行环境所需的环境变更
4.安装tomcat8
5.安装Apache solr
上述代码示例中,使用creates选项可以判断解压后的某个指定文件是否存在并确定指定版本的solr软件包是否已经被解压过,如果文件存在则说明该软件已经被解压过
上述playbook的任务是将tomcat所需的slor页面文件和库文件全部部署到位
6.修改solr的配置文件的<env-entry>部分来指定solr的home目录
7.将该文件发送到目标主机
8.将solr和tomcat安装目录中的所有文件的属组和属主全部设置为普通用户tomcat
- name: 修改solr和tomcat安装目录下的文件权限并启动tomcat
file:
path: "/opt"
owner: tomcat
group: tomcat
recurse: yes
notify: start tomcat
三、Handlers
1.以下示例为通过handlers实现重启apache功能
2.handlers调用handlers,直接在handlers中使用notify选项
3.handlers只有在其所在的任务被执行时才会被运行;handlers只会在play的末尾运行一次,如果要在playbook的中间运行handlers需要使用meta模块来实现(如:- meta: flush_handlers);如果一个play在运行到调用handlers的语句之前失败,这个handlers将不会被执行,我们可以使用mega模块的 --force-handlers选项来强制执行handlers.
四、环境变量
1.当我们想为连接远程主机的账号设置一些环境变量,可以使用lineinfile模块直接修改远程用户的~/.bash_profile文件
例如:- name: 为远程主机上的用户指定环境变量
lineinfile: dest=~/.bash_profile regexp=^ENV_VAR= line=ENV_VAR=value
之后使用source ~/.bash_profile重读环境变量配置文件
五、变量
1.在inventory文件中,使用=为变量赋值但在playbook中用:来为变量赋值
2.playbook变量
ansible-playbook example.yml --extra-vars "foo=bar"
ansible-playbook example.yml --extra-vars "@even_more_vars.json/yml"
上述两条命令的区别是用Ad-Hoc的方式设置额外变量
在playbook中最常见的定义变量的方式是使用vars代码块
- hosts: example
vars:
foo: bar
tasks:
- debug: msg="Variable 'foo' is set to { { foo }}"
变量定义也可以在一个独立的文件中完成
- hosts: example
vars_files:
- vars.yml
tasks :
- debug: msg="Variable ' foo' is set to { { foo }}"
foo: bar
上例中使用vars_file代码块来调用独立文件vars.yml,并且能够成功读取其中定义的变量。上数定义变量的文件中需要注意的是,定义变量的代码需要顶格写。
3.在inventory文件中定义变量
在执行ansible命令时,ansible默认会从/etc/ansible/host_vars/和/etc/ansible/group_vars/两个目录下读取变量的定义,也可以在这两个目录中创建与hosts文件中主机名或组名同名的文件来定义变量
比如,现在需要给app.test.com主机这只一组变量,可以直接在/etc/ansible/host_vars/目录下创建一个名为app.test.com的空白文件,然后在该文件中以yaml语法来定义所需的变量,同理,需要给主机组定义变量需要在/etc/ansible/group_vars/这个文件目录下创建变量文件。
4.注册变量
用来保存操作结果的变量叫做注册变量,需要用register来声明
5.主机变量和组变量
默认存放的位置为/etc/ansible/hosts
[group]
host1
host2
定义的主机组
[group]
host1 admin_user=jane
host2 admin_user=jack
上述示例中分别为host1和host2定义了一个变量
[group:vars]
admin_user=john
该示例会对主机组group下面的所有主机都生效
6.变量的优先级
由高到低依次为:
命令行中定义的变量 在inventory中定义的连接变量 大多数的其他变量
在inventory定义的其他变量
六、 任务间流程控制
1.任务委托:ansible所有的任务都是在指定的机器上运行,当出现要给某台服务器发送通知或者想监控服务器中添加被监控的主机就需要该任务在特定的主机上运行而不是一开始指定的所有主机,此时需要ansible的任务委托功能。
2.使用delegate_to关键字配置任务在指定的机器上执行,而其他任务仍然在hosts关键字配置的所有机器上运行当到了这个关键字所在的任务上就会使用委托的机器运行。
3.任务暂停:有些情况下一些任务需要等待一些状态的恢复,比如某一台主机或者应用刚刚启动,我们需要等待它上面的某个端口开启,此时我们不得不将正在运行的任务暂停直到其状态满足我们的需求。
上述示例中的任务会每10s检查一次主机webserver1上面的80端口是否开启,如果超过300s,80端口扔未开启,将会返回失败信息。
wait_for模块一般需要搭配host post timeout来判断一段世家内主机的端口是否可用
可以结合path选项和正则表达式以及timeout选项来判断某个路径下的文件是否存在
使用delay选项来指定在timeout事件内进行检测的事件间隔,单位为s
七、交互式提示
1.ansible任务在运行的过程中需要输入一些数据时动态或者私密的,比如输入用户自己的账号和密码,如下图示例:
private的值为yes表示其中输入的字符默认时不可见的
default为变量设置默认值节省用户的输入时间
confirm表示要求用户输入两次
八、Tags标签
1.默认情况下,ansible在执行playbook时会执行playbook中定义的所有任务,ansible中定义的标签功能可以给角色、文件、单独的任务打上标签,然后利用标签来执行指定的要运行的playbook中的个别任务
例如:ansible-playbook tags.yml --skip-tags "test"
该段代码表示跳过带有test标签的任务
九、Block块
1.块功能可以将任务进行分组