1 ansible基本架构

ansible源码部署mysql ansible source_python


上图为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”

**

ansible源码部署mysql ansible source_ansible源码部署mysql_02


**

4.5 service模块

arguments 给命令提供一些选项
enabled 是否开机启动
name 服务名称
pattern 定义模式
runlevel 运行级别
sleep 休眠
state 状态(started/sopped/reload/restarted)

ansible源码部署mysql ansible source_python_03


ansible源码部署mysql ansible source_ansible源码部署mysql_04

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脚本。

ansible源码部署mysql ansible source_python_05

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 查看主机数量

ansible源码部署mysql ansible source_运维_06


ansible源码部署mysql ansible source_python_07


ansible源码部署mysql ansible source_运维_08

5.2 role角色

ansible源码部署mysql ansible source_后端_09

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任务,仔细观察执行后的结果就会发现嵌套循环的规律也就很容易理解嵌套循环了

ansible源码部署mysql ansible source_python_10

C 锚点并行遍历列表

tasks:
    - debug: "msg={{ item.0 }} and {{ item.1 }}"
      with_together:
      - [ 'a', 'b', 'c', 'd','e' ]
      - [ 1, 2, 3, 4 ]

ansible源码部署mysql ansible source_python_11

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

ansible源码部署mysql ansible source_运维_12

E 锚点比哪里文件列表内容

- hosts: abc
  gather_facts: False
  tasks:
    - debug: 
        msg: "{{ item }}"
      with_file:
        - /home/loops.log
        - /home/newloops.log

ansible源码部署mysql ansible source_python_13

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

ansible源码部署mysql ansible source_python_14

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

ansible源码部署mysql ansible source_ansible源码部署mysql_15

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

ansible源码部署mysql ansible source_python_16

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软件包。

设置参数

ansible源码部署mysql ansible source_运维_17

D 开启facts缓存

如果你不使用facts里的信息,可以在playbook中设置gather_facts: False来提交效

设置参数

使用json文件存储facts信息

ansible源码部署mysql ansible source_ansible源码部署mysql_18

9 ansible规范

ansible源码部署mysql ansible source_运维_19