1 Playbook介绍
1.1 Playbook介绍
playbook 是由一个或多个play组成的列表
Playbook 文件使用YAML来写的
1.2 YAML
1.2.1 介绍
是一种表达资料序列的格式,类似XML
Yet Another Markup Language
2001年首次发表
www.yaml.org
1.2.2 特点
可读性好
和脚本语言交互性号
易于实现
适用程序执行流梳理方式
可扩展性强
1.2.3 语法简介
在文件中用[---]
开始
在文件中用[...]
结尾
次行一般书写文件内容
缩进严格
大小写敏感
key/value可以多行书写也可一行书写,一行书写用,隔开
value可以是个字符串,也可是list
一个play需要包括name和tasks
name 是描述
tasks 是动作
一个name只能包含一个task
扩展名称yml或者yaml
1.2.4 YAML 列表
[Linux,C++,Java,Python]
- Linux
- C++
- Java
- Python
1.2.5 YAML的字典
字典作用存放键值
name:westos
age:12
jobs:linux
1.3 playbook执行命令
- Playbook的核心组件
name #可选,建议使用多用于说明
hosts #受控主机列表
tasks #任务
#用与选择执行部分代码
ansible-playbook xxx.yml ...
--check|-C ##检测
--syntax-check ##check language
--list-hosts ##列出hosts
--list-tags ##列出tag
--list-tasks ##列出task
--limit ##指定执行主机
-v -vv ##现实过程
1.4 vim 设定技巧
autocmd FileType yaml setlocal ai ts=2 sw=2 et
setlocal ##设定当前文件
ai ##自动退格对齐 auto indent
ts ##tab建长度为2空格 tabstop=2
sw ##缩进长度为2 shiftwidth=2
et ##把tab键变成空格 expandtab
1.5 playbook项目
2 Playbook的使用
2.1 变量
2.1.1 变量命令
只能包含数字,下划线,字母
只能用下划线或字母开头
2.1.2 变量级别
全局: 从命令行或配置文件中设定的
paly: 在play和相关结构中设定的
主机: 由清单,事实收集或注册的任务
变量优先级设定:
狭窄范围高 paly>主机>全局
2.1.3 在playbook中直接定义变量
vars: msg: sxl666
2.1.4 在文件中定义变量
vars_files: var_file.yml
2.1.5 使用变量
msg: "{{msg}}"
2.1.6 设定主机变量和清单变量
[westos1]
192.168.1.10
192.168.1.20[westos1:vars]
msg=sxl000
2.1.7 目录设定变量
group_vars ##清单变量,目录中的文件名称与主机清单名称一致
host_vars ##主机变量,目录中的文件名称与主机名称一致
2.1.8 用命令覆盖变量
ansible-playbook user.yml -e "USER=hello"
2.1.9 使用数组设定变量
#vim user_var.yml
---
USER:lee:age: 18obj: linuxwestos:age: 20obj: java
#vim user.yml
- name: Create Userhosts: allgather_facts: novars_files:./user_var.ymltasks:- name: create usershell:echo "{{USER['lee']['age']}}"echo "{{USER.westos.obj}}"
create web vhost
www.westos.com 80 ------ > /var/www/html ------> www.westos.com
linux.westos.com 80 ------> /var/www/virtual/westos.com/linux -----> linux.westos.com
2.1.10 注册变量
#register 把模块输出注册到指定字符串中
---
- name: test registerhosts: 172.25.0.254tasks:- name: hostname commandshell:hostnameregister: info- name: show messagesshell:echo "{{info['stdout']}}"
2.1.11 事实变量
事实变量是ansible在受控主机中自动检测出的变量
事实变量中还有与主机相关的信息
当需要使用主机相关信息时不需要采集赋值,直接调用即可
因为变量信息为系统信息所以不能随意设定仅为采集信息,故被成为事实变量
---
- name: test registerhosts: 172.25.0.254tasks:- name: show messagesdebug:msg: "{{ansible_facts['architecture']}}"
gather_facts: no ##在playbook中关闭事实变量收集
2.1.12 魔法便变量
hostvars: ##ansible软件的内部信息
#eg:
ansible localhost -m debug -a "var=hostvars"
group_names: ##当前受管主机所在组
#eg:
ansible localhost -m debug -a "var=group_names"
groups: ##列出清单中所有的组和主机
#eg:
ansible localhost -m debug -a "var=groups"
inventory_hostname: ##包含清单中配置的当前授管主机的名称
#eg:
ansible localhost -m debug -m "var=inventory_hostname"
2.1.13 JINJA2模板
Jinja2是Python下一个被广泛应用的模版引擎
他的设计思想来源于Django的模板引擎,
并扩展了其语法和一系列强大的功能。
其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能
##j2模板书写规则#
{# /etc/hosts line #} ##注释说明文件用途
127.0.0.1 localhost ##文件内容
{{ ansible_facts['all_ipv4_addresses'] }} {{ansible_facts['fqdn']}} ##使用事实变量
#j2模板在playbook中的应用#
#playbook1
---
- name: test registerhosts: xxxxtasks:- name: create hoststemplate:src: ./xxxx.j2dest: /mnt/hosts
#playbook2
---
- name: test.j2hosts: 172.25.0.254vars:students:- name: student1obj: linux- name: student2age: 18obj: linuxtasks:- template:src: ./test.j2dest: /mnt/list
1 for循环
vim users.yml
users:- westos
- linux- ansible
vim test.j2
{% for NAME in users %}
{{ NAME }}
{%endfor%}loop.index ##循环迭代记数从1开始
loop.index0 ##循环迭代计数从0开始
2 if判断
{% for NAME in users if not NAME == "ansible" %}
User number {{loop.index}} - {{ NAME }}
{%endfor%}
loop.index ##循环迭代记数从1开始
loop.index0 ##循环迭代计数从0开始
{% for user in students %}
name: {{user['name']}}
{%if user['age'] is defined%}
age: {{user['age']}}
{%endif%}
{% if user['age'] is not defined %}
age: null
{% endif%}
obj: {{user['obj']}}
{%endfor%}
2.2 加密控制
2.2.1 创建建立文件
ansible-vault create westos
vim westos-vault
lee
ansible-vault create --vault-password-file=westos-valut westos
- 加密现有文件
ansible-vault encrypt test
- 查看加密文件
ansible-vault view westos
ansible-vault view --vault-password-file=westos-valut westos
- 编辑加密文件
ansible-vault edit westos1
ansible-vault edit --vault-password-file=westos-valut westos
- 解密文件
ansible-vault decrypt westos ##文件永久解密
ansible-vault decrypt westos --output=linux ##文件解密保存为linux
- 更改密码
ansible-vault rekey westos1
ansible-vault rekey westos1 --new-vault-password-file=key1
playbook#
ansible-playbook apache_install.yml --ask-vault-pass
2.3 循环
2.3.1 简单循环
loop: ##赋值列表- value1- value2- ...
{{item}} ##迭代变量名称
#实例#
---
- name: create filehosts: 172.25.0.254tasks:- name: file modulefile:name: /mnt/{{item}}state: presentloop:- westos_file1- westos_file2
2.3.2 循环散列或字典列表
- name: create filehosts: 172.25.0.254tasks:- name: file moduleservice:name: "{{ item.name}}"state: "{{ item.state }}"loop:- name: httpdstate: started- name: vsftpdstate: stopped
2.4 条件
when:- 条件1- 条件2
#条件判断#
= value == "字符串",value == 数字
< value < 数字
> value > 数字
<= value <= 数字
>= value >= 数字
!= value != 数字
is defined value value is defined 变量存在
is not defined value is not defined 变量不存在
in value is in value 变量为
not in value is not in value 变量不为
bool变量 为true value value的值为true
bool变量 false not value value的值为false
value in value2 value的值在value2列表中
#多条条件组合#
when:条件1 and 条件2- 条件1- 条件2
when:条件1 or 条件2
when: >条件1or条件2
2.5 触发器
notify: 触发器当遇到更改是触发handlers
handlers: 触发器触发后执行的动作
#实例#
---
- name: create virtualhost for web serverhosts: 172.25.0.254vars_files:./vhost_list.ymltasks:- name: create documentfile:path: "{{web2.document}}"state: directory- name: create vhost.confcopy:dest: /etc/httpd/conf.d/vhost.confcontent:"<VirtualHost *:{{web1.port}}>\n\tServerName {{web1.name}}\n\tDocumentRoot
{{web1.document}}\n\tCustomLog logs/{{web1.name}}.log combined\n</VirtualHost>\n\n<VirtualHost *:
{{web2.port}}>\n\tServerName {{web2.name}}\n\tDocumentRoot {{web2.document}}\n\tCustomLog logs/
{{web2.name}}.log combined\n</VirtualHost>"notify:restart apachehandlers:- name: restart apacheservice:name: httpdstate: restarted
2.6 处理失败任务
2.6.1 ignore_errors
#作用:
当play遇到任务失败是会终止
ignore_errors: yes 将会忽略任务失败使下面的任务继续运行
#实例#
- name: testdnf:name: westosstate: latestignore_errors: yes- name: create filefile:path: /mnt/westosstate: touch
2.6.2 force_handlers
#作用:
#当任务失败后play被终止也会调用触发器进程
#example
---
- name: apache change porthosts: 172.25.0.254force_handlers: yesvars:http_port: 80tasks:- name: configure apache conf filelineinfile:path: /etc/httpd/conf/httpd.confregexp: "^Listen"line: "Listen {{ http_port }}"notify: restart apache- name: install errordnf:name: westosstate: latesthandlers:- name: restart apacheservice:name: httpdstate: restartedenabled: yes
2.6.3 changed_when
#作用:
#控制任务在何时报告它已进行更改
---
- name: apache change porthosts: 172.25.0.254force_handlers: yesvars:http_port: 8080tasks:- name: configure apache conf filelineinfile:path: /etc/httpd/conf/httpd.confregexp: "^Listen"line: "Listen {{ http_port }}"changed_when: truenotify: restart apachehandlers:- name: restart apacheservice:name: httpdstate: restartedenabled: yes
2.6.4 failed_when
#当符合条件时强制任务失败
---
- name: testhosts: 172.25.0.254tasks:- name: shellshell: echo helloregister: westosfailed_when: "'hello' in westos.stdout"
2.6.5 block
block: ##定义要运行的任务
rescue: ##定义当block句子中出现失败任务后运行的任务
always: ##定义最终独立运行的任务
#测试练习#
建立playbook ~/westos.yml要求如下:
建立大小为1500M名为/dev/vdb1的设备
如果/dev/vdb不存在请输入:/dev/vdb is not exist
如果/dev/vdb大小不足2G请输出:/dev/vdb is less then 2G
并建立800M大小的/dev/vdb1
此设备挂载到/westos上
3 ansible roles
#ansible 角色简介#
- Ansible roles 是为了层次化,结构化的组织Playbook
- roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们
- roles一般用于基于主机构建服务的场景中,在企业复杂业务场景中应用的频率很高
- 以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;相当于函数的调用把各个功能切割
成片段来执行。
#roles目录结构#
files ##存放copy或script等模块调用的函数
tasks ##定义各种task,要有main.yml,其他文件include包含调用
handlers ##定义各种handlers,要有main.yml,其他文件include包含调用
vars ##定义variables,要有main.yml,其他文件include包含调用
templates ##存储由template模块调用的模板文本
meta ##定义当前角色的特殊设定及其依赖关系,要有main.yml的文件 defaults##要有main.yml的文
件,用于设定默认变量
tests ##用于测试角色
#role存放的路径在配置文件ansible.cfg中定义#
roles_path = path/roles (默认目录:/etc/ansible/roles)
#创建目录结构#
$ ansible-galaxy init apache
$ ansible-galaxy list
#playbook中使用roles#
playbook中使用roles:
- hosts: server2
roles: - role: role1
- role: role2
var1: value1 ##此处变量会覆盖roles中的定义变量
#控制任务执行顺序#
- hosts: server2
roles: - role: role1 ##角色任务
pre_tasks: ##角色执行前执行的play - tasks1
tasks: ##普通任务 - tasks2
post_tasks: ##在角色和普通任务执行完毕后执行的play - tasks3
handlers:
#ansible—galaxy命令工具#
- Ansible Galaxy 是一个免费共享和下载 Ansible 角色的网站,可以帮助我们更好的定义和学习roles。
- ansible-galaxy命令默认与https://galaxy.ansible.com网站API通信,可以查找、下载各种社区开发的 Ansible 角色
- ansible-galaxy在 Ansible 1.4.2 就已经被包含了
- 在galaxy.ansible.com网站查询roles
#安装选择的角色#
#install https://galaxy.ansible.com roles
$ansible-galaxy install geerlingguy.nginx
#install local roles
$ vim install_apache_role.yml
- src: file:///mnt/apache.tar.gz
name: apache
$ ansible-galaxy install -r install_apache_role.yml