Jinja2模板
- jinja2文件以.j2为后缀
- 注释 {# #}
- 变量{{ var}}
- 逻辑 {% %}
{% for %}
...
...
{% endfor %} #循环控制
{% if %}
...
{% elif %}
...
{% else %}
...
{% endif %} #条件
在ANSIBLE具体使用
cat config.j2 #一个基于Facts的实例
wlecome host {{ ansible_hostname }}, os is {{
ansible_os_family }}
today is {{ ansible_date_time.date }}
cpucore numbers {{ ansible_processor_vcpus }}
{% if ansible_processor_vcpus > 1 %}
OS CPU more than one core
{% endif %}
---
- name: a template example
hosts: all
remote_user: root
tasks:
- name: update jinja2 config
template: src=config.j2 dest=/tmp/config.conf
...
调试
ansible-playbook checkhosts.yml --limit dbservers -vvv
优化 Ansible 执行速度
设置 SSH 为长连接
vi /etc/ansible/ansible.cfg
ssh_args = -C -o ControlMaster=auto -o
ControlPersist=86400s
ss -nta |grep ESTAB #验证
开启 pipelining
默认 Ansible 执行过程中会把生成好的本地python 脚本文件 PUT 到 远端机器。如果开启了 ssh 的pipelining 特性,这个过程就会在 SSH 的会话中进行。
vi /etc/ansible/ansible.cfg
pipelining = True
设置 facts 缓存
#缓存本地
vi /etc/ansible/ansible.cfg
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /dev/shm/ansible_fact_cache
fact_caching_timeout = 86400s
#缓存Redis
gathering = smart
fact_caching = redis
fact_caching_connection = 192.168.188.8:6379:0
fact_caching_timeout = 86400s
异步和轮询
ansible dbservers -B 10 -P 0 -a "sleep 5"
ansible dbservers -m
async_status -a "jid=191465439990.2210"
Playbook 中使用异步
cat async.yml
tasks:
- name:
shell: /bin/sleep 5;hostname -i
async: 6
poll: 0
register: job
- name:
debug:
var: job
cat getJobResult.yml
tasks:
- name: Get job result
async_status:
jid: "801565582767.3551"
register: job_result
- name: debug job result
debug:
var: job_result
使用多个 Inventory 文件
ansible-playbook -i development -i
production get_logs.yml #从命令⾏
#使用目录汇总清单源
#目录仅支持.yaml .yml .json扩展名
inventory/
01-static-inventory.yml
02-static-inventory.yml
group_vars/
all.yml
使用Inventory scripts
#!/usr/bin/env python
import sys
import json
import argparse
def lists():
dic = {}
host_list = [ '192.168.2.{}'.format(str(i) ) for
i in range(20,23) ]
hosts_dict = {'hosts': host_list}
dic['computes'] = hosts_dict
return json.dumps(dic,indent=4)
def hosts(name):
dic = {'ansibl_ssh_pass': '12345'}
return json.dumps(dic)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-l', '--list', help='host
list', action='store_true')
parser.add_argument('-H', '--host', help='hosts
vars')
args = vars(parser.parse_args())
if args['list']:
print( lists() )
elif args['host']:
print( hosts(args['host']) )
else:
parser.print_help()
项目录结构
mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
官方推荐
production # 关于⽣产环境服务器的资产清单
develop # 关于开发环境的清单⽂件
group_vars/
group1 # 组 group1 的变量⽂件
group2 # 组 group2 的变量⽂件
host_vars/
hostname1 # hostname1 定义的变量⽂件
hostname2 # hostname2 定义的变量⽂件
library/ # 如果有自定义的模块,放在这⾥
filter_plugins/ # 如果有自定义的过滤插件
site.yml # 执⾏ playbook 的统⼀入口文件
webservers.yml # 特殊任务的 playbook
dbservers.yml # 还是特殊任务的 playbook
roles/ # role 存放⽬录
common/ # common ⻆⾊的⽬录
tasks/
main.yml
handlers/
main.yml
templates/
ntp.conf.j2
files/
bar.txt
foo.sh
vars/
main.yml # common ⻆⾊定义的变量⽂件
defaults/
main.yml # common ⻆⾊定义的默认变量⽂件(优先级低)
meta/
main.yml # common ⻆⾊的依赖关系⽂件
webtier/ # 下⾯这些都是和 common 同级
monitoring/
fooapp/
回调插件
- aggregate 聚合类型 比如timer
- notification 通知类型 比如log_plays mail
- stdout 标准输出类型
修改默认的回调插件
vi /etc/ansible/ansible.cfg
[defaults]
stdout_callback = json #默认情况仅对playbook⽣效
[defaults]
bin_ansible_callbacks = True #对ad-hoc也生效
启用其他内置的回调插件
vi /etc/ansible/ansible.cfg
callback_whitelist = timer, mail, profile_roles
把返回结果输出到日志中
vi /etc/ansible/ansible.cfg
[callback_log_plays]
log_folder=/tmp/ansible/hosts/
callback_whitelist = log_plays