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 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook:
ad-hoc模式(点对点模式):使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
playbook模式(剧本模式):是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件
执行流程

简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。
ansible 命令执行过程
- 加载自己的配置文件,默认
/etc/ansible/ansible.cfg; - 查找对应的主机配置文件,找到要执行的主机或者组;
- 加载自己对应的模块文件,如 command;
- 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
- 对应执行用户的家目录的
.ansible/tmp/XXX/XXX.PY文件; - 给文件 +x 执行权限;
- 执行并返回结果;
- 删除临时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'"



浙公网安备 33010602011771号