ansible

 

centos ansible安装

安装Ansible最新版本或者指定版本

# 安装最新版本,前提为已安装python3
/usr/local/python/bin/pip3 install ansible
/usr/local/python/bin/ansible --version
ln -s /usr/local/python/bin/ansible /usr/local/bin/
ansible --version

# 安装指定版本
/usr/local/python/bin/pip3 install ansible==2.9.5

 

查看ansible-doc

/usr/local/python/bin/ansible-doc -l    #查看总帮助
/usr/local/python/bin/ansible-doc -s shell  #查看shell模块的帮助
/usr/local/python/bin/ansible-doc -s raw

# 增加软连接
ln -s /usr/local/python/bin/ansible-doc /usr/local/bin/

 

 

ansible架构

 Host inventory,动态inventory

可知道管理了那些主机

实际执行管理主机:playbook,core module ,roles

实现与管理主机连接 connection plugins :目前基于ssh

 动态格式:实现动态hosts 代码需支持 --list ,--host两个参数

 

如:python inventoryv3.py --list

 json格式

 

 

 

 

ansible 任务执行

Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhocplaybook

ad-hoc模式(点对点模式):使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。

playbook模式(剧本模式):是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件

执行流程

 

 简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。

ansible 命令执行过程

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
  2. 查找对应的主机配置文件,找到要执行的主机或者组;
  3. 加载自己对应的模块文件,如 command;
  4. 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
  5. 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
  6. 给文件 +x 执行权限;
  7. 执行并返回结果;
  8. 删除临时py文件,sleep 0退出;

 

ansible 中小型企业(500-300台),基于openSSH 不需要代理 (ssh8.2已发布)

ansible模块相当于Linux shell 命令 常用30个左右

三个主要模块:

Paramike: 基于ssh 开发的实,实现远程控制的的通讯模块,原因为ansible无代理

PyYAML:ansible剧本编写 

jinja2:模板语言

 

支持playbook编排任务(如定时任务)

幂等性:一个任务执行一次与执行n次 效果一样,不因为重复执行带来意外,(如调试脚本)

较大的多层解决方案,即角色,角色为多个playbook组成,playbook 由多个模块构成

利用ansible 实现管理的方式:

Ad-Hoc 即ansible命令,主要用于临时命令使用创建

ansible-playbook 主要用于长期规划好的,大型项目场景

 

基于key验证(公钥密钥认证方式联系各被管理的节点)

[root@i-2ca1um3l ansible]# ssh-keygen

 

[root@i-2ca1um3l ansible]# ssh-copy-id  ip

 

 

[root@i-2ca1um3l ansible]# ansible 10.39.46.203 -m ping

 

 

visudo 修改Linux用户权限

注意事项:

ansible 主控端python 要求>=2.6,

被控端如果开启selinux 需要安装libselinux-python,一般关闭selinux

当被控制机为了安全将ssh22端口改为其他端口时,需指定

 命令,脚本尽量用单引号

建议使用shell 模块

常用配置文件

host_key_checking = Flase,log_path=/var/log/ansible.log 这两项建议启动,ansible不是以服务状态存在的,cfg文件不存在内存中,只是需要执行时读取,故,修改配置文件后不需要执行

 目前有3387个模块 (20200216 22:00)

 

常用命令

 

 

主机表示方法

 

 

 

 

 使用实例

 

常用模块 默认为command

 

 

 

 

 

 

 

 

handler notify 触发器示例

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 ansible 模块setup 查询系统信息: ansible test -m setup -a 'filter=ansible_fqdn'

ansible变量 

 Ansible 使用 “{{ var }}” 来引用变量. 如果一个值以 “{” 开头, YAML 将认为它是一个字典, 所以我们必须引用它, 像这样: foo: "{{ variable }}"

 

 ansible playbook变量使用:单一主机变量,整体变量 

直接定义变量,在执行ansible命令时输入变量值:如变量 pkname : ansible-playbook -e 'pkname=sftpd' ant.yml

 

 

 

 playbook 内部vars 定义变量 ,并使用变量

 

在单一主机或多个主机定义变量,zai hosts中定义http_port变量,在playbook中使用,ansible-playbook ant.yml

如果在命令行中对nodename指定新命令,会执行新命令中的值,如: ansible-playbook -e 'nodename=http' ant.yml 实际nodename为http 而非www

次特征为unix 命令行优先级高于配置端

 

根据变量名创建文件

 

 

 

 ansible设置内存监控指标,如设置总内存的75% 

 将所有变量放到一个文件var.yml中,ansible-playbook playbook.yml中调用var.yml

 

 

 

 模块 template 建议在 /etc/ansible/template/下创建文件,只能用在playbook

 

案例1

 

 

command,shell 关心返回码 

使用 command module 和 shell module 时,我们需要关心返回码信息,如果有一条命令,它的成功执行的返回码不是0, 你或许希望这样做:

tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand || /bin/true

或者是这样:

tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand
    ignore_errors: True

ansible when ,for循环

 

 

 

 

 

 

 

pybook for, if 循环创建文件,plbook.yml template模板

 

 

 

 

roles角色思想 (include已不用)

 

 

 

 roles 文件路径及目录结构, 官方默认etc/ansible/roles,eg:

基本架构:

 

 

 

 

 

 

创建账户:

 

 user,group,为系统账户,nologin

 pybook多个roels ,加标签(可加多个标签),roles 也可调用其他role中task.yml

 

 

 

[root@i-2ca1um3l ansible]# ansible all -m copy -a 'src=/etc/ansible/hosts dest=/home/yqt/ mode=000 owner=root'

 ansible-galaxy  :下载网上的role

 

 

ansible 动态 inventory获取hosts, 命令行传递参数的方法

 

 注意执行inventory.py 时赋权 chmod +x inventory 

 vim  set ff=unix

直接传ip值、别名

ansible-playbook -i inventory.py ping.yml --extra-vars "hosts='10.39.10.xx' user=root"

在命令行里面传group得的方法:

ansible-playbook -i inventory.py ping.yml --extra-vars "hosts='物联' user=root"

还可以用json格式传递参数:

ansible-playbook -i inventory.py ping.yml --extra-vars "{'hosts':'物联', 'user':'root'}"  -v

还可以将参数放在文件里面:

ansible-playbook -i inventory.py ping.yml --extra-vars "@vars.json"

同时执行a,b 两组,用冒号分隔

ansible -i inventory.py a:b -m shell  -a "uname -a"

 

获取 主机信息:

ansible 10.39.46.xx -m setup xxx

 

handler

每个主流的编程语言都会有event机制,那么handler就是playbook的event。

handlers不会默认的按顺序执行。

Tasks中的任务都是有状态的,changed或者ok。 Ansible提供了一种机制,只在task的执行状态为changed的时候,才会触发执行,这就是handler。

如果你在tasks中修改了apache的配置文件。需要重起apache。此外还安装了apache的插件。那么还需要重起apache。像这样的应该场景中,重起apache就可以设计成一个handler.

 

delegate_to

如果需要在不是该组的主机执行命令,可以通过该命令委托任务到其它机器上执行

所以经常用到delegate_to和connection,而local_action写法难看,基本不用。

delegate_to和connection最后达到的目标是一致的,

就是把目标服务器上的{{ }}大括号标记的变量在代理连接的节点(delegate_to: host)上调用。

示例

inventory_file : /etc/ansible/hosts

[controller]
192.168.10.3 node-1
192.168.10.4 node-2
...

playbook: 
---
- name: connection
  hosts: controller
  vars:
    tmplog: /tmp/connection.log
  tasks:
  - name: create tmplog
    shell: test ! -f {{ tmplog }} && touch {{ tmplog }}
    failed_when: false
  - name: conneciton
    shell: echo "connection . {{ inventory_hostname }} $(hostname) ." >> {{ tmplog }}
    connection: local
  - name: delegate_to
    shell: echo "delegate_to . {{ inventory_hostname }} $(hostname) ." >> {{ tmplog }}
    delegate_to: localhost
...
inventory_hostname 当前task的host在inventory文件中的hostname, $(hostname)代理host上的hostname
#####
[root@node-1 test_plays]# cat /tmp/connection.log 
connection . 192.168.10.3 node-1.domain.tld .
connection . 192.168.10.4 node-1.domain.tld .
delegate_to . 192.168.10.3 node-1.domain.tld .
delegate_to . 192.168.10.4 node-1.domain.tld .
在node-1上执行,node-2的tmplog都是空的

 

ansible执行nohup shell命令卡住问题

原因: 执行后光标是不能跳到终端的起始位置的,(就是$或者#后面),需要敲一个回车才行。在执行nohup的时候加上重定向到nohup.out中,然后再把错误输出最好也重定向到标准输出。

如:nohup /usr/local/cronsun-v0.3.5/cronnode -conf /usr/local/cronsun-v0.3.5/conf/base.json >nohup.out 2>&1 &

 

ansible playbook常用命令

ansible指定ssh端口及密码

 ansible-playbook -i inventory.py filebeat.yml --extra-vars "{'hosts':'all','ansible_ssh_port':20022,'ansible_ssh_pass':'bWXZLWw9tazxhPEgQEy5O1ME'}"

ansible shell模块

ansible -i inventory.py 20022 -m shell -a 'ls -ll'

ansible copy模块

ansible -i inventory.py all -m copy -a 'src=/etc/ansible/script/telegraf_alive.sh dest=/etc/telegraf/telegraf_alive.sh'

ansible 运行部分ip

ansible-playbook -i inventory.py filebeat.yml --extra-vars "{'hosts':'"10.39.200.xx","10.39.200.xx'}"

ansible  replace模块

ansible -i inventory.py all -m replace -a "path=/etc/telegraf/telegraf.conf regexp='192.168.235.3' replace=192.168.235.4"

ansible  lineonfile模块

ansible -i inventory.py all -m lineinfile -a "name=/opt/apache-zookeeper-3.6.3-bin/conf/zoo.cfg regexp='/data/zookeeper/data' line='dataDir=/data/zookeeper/data'"

posted @ 2020-02-16 00:01  云清拓  阅读(119)  评论(0)    收藏  举报