1 ansible基本架构
上图为ansible的基本架构,从上图可以了解到其由以下部分组成:
• 核心:ansible
• 核心模块(Core Modules):这些都是ansible自带的模块
• 扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
• 插件(Plugins):完成模块功能的补充
• 剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
• 连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
• 主机群(Host Inventory):定义ansible管理的主机
2 ansible安装
可以访问ansible官网,查看对应操作系统下载版本,以下以ubuntu系统为例
https://docs.ansible.com/
基于ubuntu
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible
安装完成后主要有一下7个命令
1) ansible
-m:要使用的模块名称。
-a,–args:制定模块所需的参数。
-u:制定连接的用户名。
-h,–help显示帮助内容。
-k, 指定输入密码
-I, 指定加载的hosts文件目录,默认是加载/etc/ansible/hosts
-S 大S,指定使用su命令
-f 指定fork出的并行处理进程数,默认值是5。
-o 使用精简的输出
-vvvv 显示详细输出
ansible all -m ping
ansible all –I ./hosts –m shell –a ‘date’ -k
2) ansible-config
配置文件,默认在/etc/ansible/ansible.cfg
Inventory 主机清单
Module_utils 指定模型工具
Remote_tmp 远端服务器临时目录存放
Remote_port 远端服务器端口
/log+path 注释掉前面#号,才会存储日志
Transport 连接方式(默认为smart)
Poll_interval 异步执行任务时多久检查一次任务装填
3) ansible-galaxy
类似于github,去官网拉去所需要的模块
4) ansible-pull
将模块推到仓库存储
5) ansible-doc
帮助文档
ansible-doc –l 列出所有自己下载的模块
ansible-doc –s xx模块名 列出该模块的使用方法
6) ansible-lint
对playbook语法进行检查的命令
7) ansible-playbook
ansible核心功能
3 ansible免密登录
a. 生成秘钥
ssh-keygen –t rsa
b. 将秘钥拷贝到预管理节点上
ssh-copy-id –I /root/.ssh/id_rsa.pub xxx
即可完成主机之间的免密登录
4 ansible常用模块
4.1 Ping模块
4.2 setup模块
主要用于获取主机的相关信息
ansible all –m setup –a ‘filter=ansible_*_mb’ 获取内存信息
ansible all –m setup –a “filter=ansible_eth[0-2]”
4.3 file模块
force 强制创建软连接
group
mode 定义文件权限
owner 定义文件/目录所属的组
path
recurse 递归
src 源目录
dest 目标目录
state 状态
file 文件不存在时,也不创建
link 软连接
hard 硬连接
touch
absent 删除目录,取消连接
ansible all –m file –a “path=xxx state=touch”创建文件
ansible –i ./hosts chen-2 –m file –a “src=xxx dest=xxx state=link”创建软连接
ansible –I ./hosts chen-2 –m file –a “path=xxx state=absent” 删除
4.4 copy模块
backup 覆盖之前将备份
content
dest
directory_mode 递归
others
src
validate 验证
ansible –I hosts chen-2 –m copy –a “src=xxx dest=xxx owner=root mode=0644”
**
**
4.5 service模块
arguments 给命令提供一些选项
enabled 是否开机启动
name 服务名称
pattern 定义模式
runlevel 运行级别
sleep 休眠
state 状态(started/sopped/reload/restarted)
4.6 cron模块
$ crontab –e 打开任务计划
backup 对远程主机上原计划内容修改前做备份
corn_file 该文件替换远程主机上的cord.d目录下的任务计划
job 要执行的任务,依赖于state
name
specia;_time 指定执行时间
state 状态
user 指定执行的用户
ansible –i hosts chen-2 –m cron –a “name=’touch a new file’ special_time=rebbot
job=/home/chen/xx.sh”
ansible –i hosts chen-2 –m cron –a “name=’touch a new file’ special_time=rebbot job=/home/chen/xx.sh corn_file=’test ansible’”
4.7 yum及get_url模块
不推荐使用,anshible只使用该模块进行下载时,下载速度比较慢,一般多使用shell脚本。
5 ansible-playbook
5.1 编写第一个nignx.yml文件
---
- hosts: all
gather_facts: no
tasks:
- name: install nginx
yum: name=nginx state:present
- name: copy a file
cp: src=xxx dest=xxx state=xxx owner=root group=root
编写完后检查语法问题,使用ansible-playbook xxx.yml –syntax-check命令
ansible-playbook xxx.yml --list-tasks 查看任务数量
ansible-playbook xxx.yml --list-hosts 查看主机数量
5.2 role角色
tasks : 用于存放role_A的主要任务,也可以添加其他task文件,供main.yaml调用,从而实现更加复杂的部署功能。
handlers : 用于存放触发执行( hanlders )的任务。
defaults : 用于存放默认变量,优先级最低,变量优先级可参考《ansible基础-变量》。
vars : 用于存放变量文件,role_A中任务和模版里用到的变量可以在这里定义。
files :用于存放需要拷贝到目的主机的文件,例如,作为「copy」模块src参数的默认根目录。
template : 用于存放模版文件,格式为.j2,文件内容要符合Jinja2语法规则,通常使用「template」模块部署服务的配置文件。
meta : 用于存放role依赖列表,这个知识点后面会详细阐述。
tests : 用于存放测试role本身功能的playbook和主机定义文件,在开发测试阶段比较常用。
5.3 ansible引入变量
vars:
var1: chen
var2: ke
vars_file 可以引入文件作为变量
-auto_self.yml
简单循环
debug: msg=”{{item}}”
with_items:
- one
- two
- three
- four
- five
6 ansible-playbook 循环
A 标准循环
添加多个用户
- name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
- test1
- test2
- name: add several users
user: name={{ item.name }} state=present groups={{ item.groups }}
with_items:
- { name: 'test1', groups: 'wheel' }
- { name: 'test2', groups: 'root' }
添加多个用户,并将用户加入不同的组内
B 锚点嵌套循环
嵌套循环主要实现一对多,多对多的合并。
- hosts: abc
gather_facts: False
tasks:
- name: debug loops
debug: msg="name is {{ item[0] }} vaule is {{ item[1] }} num is {{ item[2] }} num is {{ item[3] }}"
with_nested:
- ['悟空','猪八戒','唐僧']
- - ['a','b','c']
- ['1','2','3']
- ['w1','w2','w3']
tags:
loops
通过:ansible-playbook loops.yaml --tags=loops 来执行对应标签的任务,这里定义了loops任务,仔细观察执行后的结果就会发现嵌套循环的规律也就很容易理解嵌套循环了
C 锚点并行遍历列表
tasks:
- debug: "msg={{ item.0 }} and {{ item.1 }}"
with_together:
- [ 'a', 'b', 'c', 'd','e' ]
- [ 1, 2, 3, 4 ]
D 锚点遍历列表和索引
- hosts: abc
gather_facts: False
tasks:
- name: indexed loop demo
debug: "msg='at array position {{ item.0 }} there is a value {{ item.1 }}'"
with_indexed_items: [a,b,c,d,e,f,g]
tags:
indexed
E 锚点比哪里文件列表内容
- hosts: abc
gather_facts: False
tasks:
- debug:
msg: "{{ item }}"
with_file:
- /home/loops.log
- /home/newloops.log
F 锚点遍历目录文件
with_fileglob 匹配单个目录中的所有文件,非递归模式匹配
- hosts: abc
gather_facts: False
tasks:
- file: dest=/home/loops.log state=directory
- copy: src={{ item }} dest=/tmp/ owner=root mode=600
with_fileglob:
- /home/*.log
G 锚点随机选择with_random_choice
7 ansible-jinjia2
7.1 编写jinja2的循环
---
- hosts: web1
vars:
hello: ansible
tasks:
- template: src=f.j2 dest=/tmp/f.j2
A 编写f.j2的jinja2的条件循环文件
[root@test-1 jinja2]# vim /ansible/jinja2/f.j2
[root@test-1 jinja2]# cat /ansible/jinja2/f.j2
{% set list=[‘one’,‘two’,‘three’] %}
{% for i in list %}
{{i}}
{% endfor %}
B 执行jinja2的执行文件test.yaml
[root@test-1 jinja2]# ansible-playbook test.yaml
7.2 编写jinja2的循环加if判断
A 编写配置文件
[root@test-1 jinja2]# vim /ansible/jinja2/test.yaml
[root@test-1 jinja2]# cat /ansible/jinja2/test.yaml
---
- hosts: web1
vars:
hello: ansible
tasks:
- template: src=f.j2 dest=/tmp/f.j2
B 编写f.j2的jinja2的条件循环加if判断文件
[root@test-1 jinja2]# vim /ansible/jinja2/f.j2
[root@test-1 jinja2]# cat /ansible/jinja2/f.j2
{% set list=['one','two','three'] %}
{% for i in list %}
{% if i == 'two' %}
-> two
{% endif %}
{% endfor %}
C 语法检测 执行配置文件
[root@test-1 jinja2]# ansible-playbook test.yaml
8 ansible的优化
A 开启SSH长连接
ssh_args = -C -o ControlMaster=auto -o ControlPersist=1d \连接保持一天
B 开启pipelining
修改 /etc/ansible/ansible.cfg 文件可以开启 pipelining
将pipelining=False
修改为
pipelining=True
C 开启accelerate模式
accelerate在远端服务器上运行一个守护进程。
注意: 开启accelerate需要在管理与被管理端都安装python-keyczar软件包。
设置参数
D 开启facts缓存
如果你不使用facts里的信息,可以在playbook中设置gather_facts: False来提交效
设置参数
使用json文件存储facts信息
9 ansible规范