ansile

ansible

ansible 是一个自动化运维工具,他是基于python语言实现,基于openssh安全的工具

特性:

1)幂等性:一个任务执行1遍和执行n遍效果一样 ,不因重复执行带来意外情况
2)无需代理不依赖PKI(无需ssl)
3)可使用任何编程语言写模块
4)YAML格式,编排任务,支持丰富的数据结构
5)较强大的多层解决方案

ansible可以直接由一台服务器连接到其他服务器,由于连接服务器时一般需要输入密码,这比较繁琐,然而ansible是基于ssh的,所以我们通常都会用秘钥的方式来连接ansible主机与其他主机

如果我们首次链接,为了避免挨个先链接所以可以把

/etc/ansible/ansible.cfg
文件中
# uncomment this to disable SSH key host checking
#host_key_checking = False

host那行取消掉注释

常用ansible时,建议吧日志那行启用起来

ansible可以编译安装或者直接yum在epel源中安装

ansible 的配置文件

1) /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
2) /etc/ansible/hosts 主机清单
3) /etc/ansible/roles/ 存放角色的目录

配置文件详解

Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默认)
[defaults]
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
#forks = 5 # 默认并发数
#sudo_user = root # 默认sudo 用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass = True
#remote_port = 22
#host_key_checking = False # 检查对应服务器的host_key,建议取消注释
#log_path=/var/log/ansible.log #日志文件

host:主机清单

可以使用
1)主机名
2)主机IP
3)用[]中括号括起来,中括号内放一个名字,这个名字是组的定义,下方写主机的名字或者IP
4)中括号中支持展开[01:06]代表01到06

程序

1) /usr/bin/ansible 主程序,临时命令执行工具
2)/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
3)/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
3)/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具/usr/bin/ansib le-pull 远程执行命令的工具
4)/usr/bin/ansible-vault 文件加密工具
5)/usr/bin/ansible-console 基于Console界面与用户交互的执行工具

使用方法

ansible-doc -s moudle(模块名):查看模块man文档

ansible-doc moudle 详细模式查看模块用法

-v -vv -vvvv :显示过程
(v越多越详细)

-C :测试ansible执行情况(不执行只测试执行结果)

命令

ansible <host-pattern> [-f forks] [-m module_name] [-a args]

-f forks :启动的并发线程数
-m moudle_name :要使用的模块
-a args:模块的参数(-a 参数需要加引号,最好是单引号)

–version 显示版本
-m module 指定模块,默认为command
-v 详细过程 –vv -vvv更详细
–list-hosts 显示主机列表,可简写—list
-k, –ask-pass 提示连接密码,默认Key验证
-K, –ask-become-pass 提示输入sudo
-T, –timeout=TIMEOUT 执行命令的超时时间,默认10s
-u, –user=REMOTE_USER 执行远程执行的用户
-b, –become 代替旧版的sudo 切换

host_pattern:

可以跟 1)单个IP
2)多个ip(中间用逗号隔开)
3)主机名
4)组名(定义在/etc/ansible/hosts文件中)
5)all 所有主机

6)a:b :指的是a组或b组中的用户(a:b要用单引号引起来)
7)a:!b
:指的是在a中但是不能再b中(同样引号引起来)

颜色定义

返回值为

绿色:表示执行成功,但对目标主机没有做出任何修改
黄色:表示执行成功,对目标主机做出了修改
蓝色:显示详细过程
红色:表示执行失败

常见的模块:

1)command:给明shell中的命令(此项是默认选项可以省略)

示例:ansible all -a ‘ls’
172.20.113.9 | SUCCESS | rc=0 >>
anaconda-ks.cfg
~None
original-ks.cfg

172.20.113.8 | SUCCESS | rc=0 >>
anaconda-ks.cfg
~None
original-ks.cfg

2)shell 类似于command 但是他可以用管道、变量等

3)cron: 给明生成一个定时任务(在crontab中生成任务 格式与定时任务的格式相同)

示例:
ansible all -m cron -a ‘minute=”*/5″ job=”/bin/echo hello” name=”test corn”‘
其中单引号中整个都是参数

4)user:修改用户属性
示例:ansible all -m user -a ‘name=“user1”’
(在所有主机中创建user1用户)
ansible all -m user -a ‘name=“user1” state=”absent”‘
(删除用户suer1)

5)group:组管理

示例:ansible all -m group -a ‘name=a gid=1 system=yes’

创建组名 a gid为1的系统组

6)copy:文件复制

示例ansible all -m copy ‘src=/etc/fstab dest=/tmp/fstat.txt owner=zhang mode=644’

复制本地/etc/fatab 到主机中的/tmp下改名为fatat.txt 数组是zhang 权限改为644

备注:src指定源文件
dest指定目标文件
(他们必须指定绝对路径)
生成文件也可以不用src 可以用content 指明文件内容

7)file:设置文件的
(修改权限 属主 属组 创建链接等
删除 创建文件、目录等)

示例:ansible all -m file -a ‘path=/tmp/fstab.link src=/tmp/fstab state=link’

给tpm/fstab创建软链接

8)ping:常用于测试ansible状态
测试远程主机的连通性
示例
ansible all -m ping
172.20.113.9 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
172.20.113.8 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
172.20.116.145 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
[root@localhost .ssh]#

9)service:用于管理服务的

ansible all -m service -a ‘enabled=ture name=httpd state=startd’

httpd服务启动,并设为开机启动

常见选项
enabled= (ture或者false)
name= (服务名)
state= (状态 startd stopped restarted)

10)script:把本地的脚本复制到每一台主机中,并执行

11)yum:管理程序包的
(前提是源都配置好)
ansible all -m yum -a ‘name=httpd’
(默认就是安装)

ansible all -m yum -a ‘name=httpd state=absent’
指的是卸载程序包

可以同时安装多个包
包名之间用逗号隔开

如果要更新缓存可以用update_catch=yes作为参数

12)setup:收集远程主机的facts(每个被管理的节点在接受并运行管理命令之前,会将自己主机的相关信息如版本、IP cpu mem等信息传送给ansible主机中)

13)fetch :和copyyige 用法一样,是把远程文件抓取到本机上

playbook:

playbook使用YAML语言

在yaml中

列表中的所有元素使用-打头

多个键值对(映射)组成的叫做字典
我们可以把字典中的项放在花括号中

yaml基础语言元素

变量
inventory
条件测试
迭代

使用方法
ansible-playbook Name.yaml

Ansible-vault:功能,加密playbook

语法:ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml 加密
ansible-vault decrypt hello.yml 解密
ansible-vault view hello.yml 查看
ansible-vault edit hello.yml 编辑加密文件
ansible-vault rekey hello.yml 修改口令
ansible-vault create new.yml 创建新文件

yaml 格式

通常首行用—三个-来标记档案

次行正常写内容

#代表注释码

缩进必须统一

一个完整的代码块最少需要name:task

playbook的核心元素

hosts:执行的主机列表
tasks:任务集
varniables:内置变量或自定义变量的调用
tags:标签
handlers和notity
templates

用法

-hosts:
remote_user:

tasks:
– name:
Moudlename: 要执行的语句

– name:
Moudlename:
要执行的语句

– name:
Moudlename:
要执行的语句

handlers:触发器,和tasts是并列关系

格式
hangdlers:
– name :
moudlename: 语句

– name :
moudlename: 语句

需要出发的项就在tasks中的最下行写
notify: name(handlers的)

如果是多任务,则notify: 换行后Name前面要加-
变量使用

变量命名
变量名仅能由字母、数字和下划线组成,且只能以字母开头
变量定义:key=value
示例:http_port=80
变量调用方式:
通过{{ variable_name }} 调用变量,且变量名前后必须有空格,有时用“{{ variable_name }}”才生效

1) 在命令中定义变量
ansible-playbook –e 选项指定
ansible-playbook test.yml -e “hosts=centos7”

2)ansibe中自带变量模块
模块是setup
查看方法:ansible all -m setup
可以用自己需要的变量做判断或者引用变量

3)playbook中变量定义
在remote_user下面写

vars:
– var1: Var
– var2: Var2
在下方tasks中用{{}}调用

4)hosts中定义变量

1、在ip后直接定义 var=var
(每个主机可以定义自己的变量,不同的主机的变量可以同名,还可以定义多个变量,)
2、还可以定义给组中的所有成员定义通用变量
格式
[组名:变量名]
var1=var1
var2=var2

变量的生效优先级:
命令行中的变量>host>playbook

host中的变量普通变量优先级高于分组优先级

5) 在playbook文件的同级目录新建file 以.yml结尾
文件中直接写变量var: var
var2: var2
(备注定义变量文件并不需要加-)

playbook的组成

1)host: 由哪些主机组成
2)moudles: 调用哪些模块
3)运行哪些命令

palybooks
1)tasks: 任务
2) var: 变量
3)templates:模板
4)handlers: 触发器
5)roles: 角色

play的主体部分是task list。task list中的各任务按次序逐个 在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出

playbook中 条件测试使用when 表示,在要调用的tasks最后写when: 条件

template:

template只能在playbook中调用

template 模板最好放在playbook文件的文件新建一个文件夹,名字叫templates。模板存在其中模板格式为j2。

针对每台主机的不同情况,可以再j2中调用不同的变量
如:hostname中的
setup中的
等等

template 用法和copy一样,他调用变量把文件按照主机不同进行重新定义,发送
这样就做到了根据主机不同配置不同的配置文件

when

跟在某task下when后写条件,指的是,满足条件时才执行task下的任务

playbook中判断相等用 ==
号(两遍有空格)

循环

with_items:循环
示例


– hosts: all
remote_user: root

tasks:
– name: create dir
file: path=/data/{{ item }} state=directory

with_items:
– dir1
– dir2
– dir3

迭代嵌套子变量

示例
– hosts:websrvs
remote_user: root
tasks:
– name: add some groups
group: name={{ item }} state=present
with_items:
– group1
– group2
– group3
– name: add some users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
– { name: ‘user1’, group: ‘group1’ }
– { name: ‘user2’, group: ‘group2’ }
– { name: ‘user3’, group: ‘group3’ }

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/100294

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code