ansibleroles实战 ansible入门教程详细的
Ansible Vault 加密
1.ansible的命令行工具ansible-vault可以加密和解密任何ansible使用的文件。
ansibleroles实战 ansible入门教程详细的
ansibleroles实战 ansible入门教程详细的
ansibleroles实战 ansible入门教程详细的
使用第三方的密钥管理服务来存储数据。
2.ansible-vault可以创建,编辑,加密,解密和查看文件。ansible vault可以加密任何ansible使用的文件,包含inventory变量,playbook中调用的变量文件,通过参数传递给playbook的变量文件,ansible-roles定义的变量文件。
create: 创建一个新文件,并直接对其进行加密
decrypt: 解密文件
edit: 用于编辑 ansible-vault 加密过的文件
encrypy: 加密文件
encrypt_strin: 加密字符串,字符串从命令行获取
view: 查看经过加密的文件
ansible总结
ansible是一种自动化运维工具,基于paramiko开发的,并且基于模块化工作,Ansible是一种集成IT系统的配置管理、应用部署、执行特定任务的开源平台,它是基于python语言,由Paramiko和PyYAML两个关键模块构建。了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能.ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的.
ansible被定义为配置管理工具,配置管理工具通常具有以下功能:
常用的自动化运维工具技术特性比较:
ansible系统由控制主机和被管理主机组成,控制主机不支持windows平台
部署简单, 只需要在控制主机上部署ansible环境,被控制端上只要求安装ssh和python 2.5以上版本,这个对于类unix系统来说相当与无需配置.
Ansible任务执行模式分为以下两种:
ansible配置文件查找顺序
ansible配置文件
ansible 有许多参数,下面我们列出一些常见的参数:
ansible的主要功用在于批量主机作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名。默认的inventory file为/etc/ansible/hosts。
inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成。
Inventory文件格式:
inventory其他的参数
ansible通过ssh实现配置管理、应用部署、任务执行等功能,因此,需要事先配置ansible端能基于密钥认证的方式联系各被管理。
ansible命令使用语法:
例如:
可以通过 ansible-doc -l 列出所有可用的module,常用的module有:
ansible -s
playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。
下面是一个简单示例:
playbooks的组成部分
执行过程:
playbook安装配置apache实战
ansilbe自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。
一个roles的案例如下所示:
在playbook中,可以这样使用roles:
也可以向roles传递参数:
也可以用条件来使用roles:
ansible运行playbook时会启动很多ssh连接来执行文件,运行命令这样的作.openssh支持这样一个优化,叫做ssh Multiplexing,当使用这个ssh Multiplexing的时候,多个连接到相同主机的ssh回话会共享相同的TCP连接,这样就只有次连接的时候需要进行TCP三次握手.
ansible会默认使用ssh Multiplexing特性,一般不需要更改配置,相关的配置项为:
ansible执行过程中,他会基于调用的模块生成一个python脚本,然后将python脚本到主机上,执行脚本.ansible支持一个优化,叫做pipelining,在这个模式下ansible执行脚本时并不会去它,而是通过管道传递给ssh会话,这会让ansible的ssh会话从2个减少到1个,从而节省时间.
pipelining默认是关闭的, 因为他需要确认被管理主机上的/etc/sudoers文件中的 requiretty 没有启用, 格式如下:
ansible开启pipelining方法, 修改ansible.cfg配置文件:
ansible playbook会默认先收集fact信息,如果不需要fact数据可以在playbook中禁用fact采集:
也可以全局禁用fact采集:
另一种解决方案就是使用fact缓存,目前ansible支持下面几种fact缓存:
JSON文件做fact缓存示例
ansible把采集到的fact写入控制主机的json文件中,如果文件已经存在,那么ansible不会再去主机上采集fact
启用JSON文件缓存,修改ansible.cfg文件:
ansible默认并发数是5,可以用下面两种方法修改并发数:
ansible内置多种云计算相关模块,如aws,openstack,docker等,下图是ansible与docker相关的模块:
通过playbook和dockerfile相结合的方式生成镜像, 示例如下:
ansible可以通过docker模块来作容器,示例如下:
多K8S集群运维管理参考
可以通过--kubeconfig 命令行参数来选择作不同集群
使用默认的 kubeconfig 文件, 需要将多个 kubeconfig 合并,保存在kubeconfig 的默认位置 $HOME/.kube/config , 合并后的参考格式如下:
kubeconfig 中定义了 (clusters)集群、(users)用户和 以及相关联的(contexts)上下文,如果使用Uk8s 可以在控制台: 概览-> 内网凭证/外网凭证 查看需要的凭证,然后按照上述格式补全即可
方式三:使用ansible Playbook 来管理集群内的容器应用
场景描述: 目前我们需要使用helm安装一个external-dns 用来将 ingess对接的域名解析规则,自动同步到DNS,使用shell命令作参考如下:
将以上作转化为 ansible-playbook 的tasks 可以拆分为四个 tasks ,
将上诉文件保存为 deploy_external_dns.yaml, 执行命令 ansible-playbook deploy_external_dns.yaml 命令执行成功回看到返回如下类似结果:
方式四:使用ansible-playbook roles来组织管理集群变更tasks
在方式三中,如果是管理一个集群,编写一个deploy_external_dns.yaml就能完成工作,如果管理多个集群,就要编写多个yaml文件,并且重复编写很多异不多的tasks 实际作可能类似这个样子:
经过对比分析,这些tasks 主要异变量:
只要将以上两个变量参考可配置化,原始的四个 tasks就可以复用,然后使用 Ansible role 重新组织tasks 文件,拆分为两个role:
其中 external_dns 依赖 helm-reitory 然后目录结构如下
roles/helm-reitory/main.yml
roles/external-dns/tasks/main.yml
roles/external-dns/meta/main.yml
新建一个文件 deploy-chart-external-dns 来引用 role:helm-reitory
,仅仅需要维护一个可复用的 role:helm-reitory ,以及在deploy-chart-external-dns 定义要集群属性等变量,就可以轻松的维护多集群内的各类容器应用了
执行命令:ansible-playbook deploy-chart-external-dns 返回结果如下:
Ansible系列-基础篇-Ansible 常见模块的使用
原文地址: Ansible系列-基础篇-Ansible 常见模块的使用
→ 上一篇中简单尝鲜了几个模块,本篇整理下实际中用到的模块及其用法Demo,总计有19个模块,分别为
ping、setup、debug、user、group、authorized_key、shell、script、command、serv、d、copy、template、synchronize、file、lineinfile、yum、cron
ping 模块主要是验证 管理 和 目标 之间的连通性,是否正常配置好了对应账号的ssh免密登录
上一篇中配置的时候提到ansible facts 收集目标主机信息,也可以使用 setup 模块。
这个模块的好处就是让了解到 Ansible 都有哪些内置的变量,这些变量在我们后续写playbook的时候,在role templates 中配置很有帮助,
举个列子,Ansible 批量部署 zabbix agent,每个agent的配置文件中的 ListenIP 和 Hostname 我们就可以使用facts中的变量 ansible_default_ipv4.address 和 ansible_hostname
另外一旦知道知道都有哪些变量的时候,下次我们就可以再收集信息展示的时候,加参数通过filter来过滤我们想看的变量就可。比如
顾名思义,就是我们想调试输出一些结果的时候,比如上面提到的我想知道目标主机的IP地址
这里有两种用法,一种是 msg 输出,需要带 {{ variable-name }} , 另外一种是 var 用法,直接写变量名即可,不用添加 {{ }}
远程管理用户/用户组
主要用来给目标主机用户配置公钥,默认到目标用户家目录的.ssh目录的authorized_keys文件 没有则创建authorized_keys文件
这里是把 shell 和 script、command放到一起做对比,其实还有个 raw
其中 command 执行单一命令不能使用管道符、重定向符等,raw 类型command,可以使用管道符等;
shell 和 script 类似,都可以执行脚本,却别在于script执行的脚本在ansible管理机上,而shell执行的脚本必须先放到目标上去,才能执行;
另外shell执行可以使用环境变量,bash等,但是script只是执行脚本,不能带 bash
都是用来管理上的服务,区别在于Serv用于centos6及以前的系统,而d命令应用于centos7系统
核心参数 namestateenabled
把管理的文件copy到目标,并配置相关属性
template 的作用和copy一样,区别在于源文件是jinja2格式,文件中可以配置 Ansible变量,然后在目标上替换成对应的目标值
另外一个需要住的就是在roles中,copy默认是从files目录获取文件,template默认是 templates 文件夹获取模板文件
主要用于目录、文件的同步,基于 rsync实现,主要是有 push 和 pull 两种方式, 如果是push 推送,则src是管理,dest是目标;如果是pull拉取,则src是目标,dest是管理
在目标创建文件或目录,删除文件或目录,修改文件或目录的权限等;核心参数有:path、state、owner、group、mode、recurse
在文件中添加、修改、删除一行记录,在实践中用的很多,这里做简单介绍,后续有单独文章详细介绍
顾名思义,就是我们在Centos下进行yum安装,核心参数主要关注: name 需要安装的软件名、state 软件的状态(present、absent、removed、latest)和 enablerepo 特殊情况指定yum源
管理Linux定时任务,核心参数说明
name 定时任务的名称、 state 任务的状态、minute/hour/day/month/weekday 分别设定任务执行的时间配置、user指定是哪个用户配置任务,默认是
哪一个role目录用于存储依赖role
通常创建一个role的方法有两种:
命令mkdir和touch行手动创建
使用ansible-galaxy自动初始化一个role
当然我现在还是用现成的。
例如,我想使用「ansible-galaxy init」命令创建一个名字为role_A 的role,可以这样写:
ansible-galaxy init role_A
如何使用Ansible 2的API做python开发
在ansible1.9的时候,API是一个非常简单的东西。说“it's pretty ”,真是又pretty又。
import ansible.runner
runner = ansible.runner.Runner(
module_name='ping',
module_args='',
pattern='web',
forks=10
)datastructure = runner.run()
到了ansible2.0以后,是“a bit more complicated”,Oh my,简直让人难受。
简洁和灵活是鱼和熊掌。
ansible2.0 API怎么用?
ansible2.0更贴近于ansible cli的常用命令执行方式,不同于上一版本只能发送单个命令或playbook;而更用户在调用ansibleAPI的时候,将playbook的每个task拆分出来,获取每个task的结果。能够跟灵活处理在执行批量作业过程中的各种反馈。
将执行作的队列模型,包含各类环境参数设置,归结到“ansible.executor.task_queue_mar”类中
将执行过程中的各个task的设置,或者说playbook中的编排内容,归结到“ansible.playbook.play”中
上述两个东西,几乎囊括了可以在执行过程中设置的所有参数,足够灵活,也让人抓狂,相当于需要自己写一个1.9版本中的runner。
他们的确也都是原生类,并非专用于外部调用。
ansible.executor.task_queue_mar
这是ansible的一个内部模块(ansible/executor/task_queue_mar.py)。初始化的源码如下:
class TaskQueueMar:
'''
This class handles the multiprocessing requirements of Ansible by
creating a pool of worker forks, a result handler fork, and a
mar object with shared datastructures/queues for coordinating
work between all processes.
The queue mar is responsible for loading the play strategy plugin,
which dispatches the Play's tasks to hosts.
'''
def __init__(self, inventory, variable_mar, loader, options, passwords, stdout_callback=None, run_additional_callbacks=True, run_tree=False):
self._inventory = inventory
self._variable_mar = variable_mar
self._loader = loader
self._options = options
self._stats = AggregateStats()
self.passwords = passwords
self._stdout_callback = stdout_callback
self._run_additional_callbacks = run_additional_callbacks
self._run_tree = run_tree
self._callbacks_loaded = False
self._callback_plugins = []
self._start_at_done = False
self._result_prc = None
……
创建时,需要的主要参数包括:
inventory --> 由ansible.inventory模块创建,用于导入inventory文件
variable_mar --> 由ansible.vars模块创建,用于存储各类变量信息
loader --> 由ansible.parsing.dataloader模块创建,用于数据解析
options --> 存放各类配置信息的数据字典
passwords --> 登录密码,可设置加密信息
stdout_callback --> 回调函数
ansible.playbook.play
ansible.playbook是一个原生模块,既用于CLI也用于API。从源码可以看出来:
try:
from __main__ import display
except ImportError:
from ansible.utils.display import Display
display = Display()
ansible.playbook.play(ansible/playbook/play.py)。初始化源码的介绍如下:
__all__ = ['Play']
class Play(Base, Taggable, Become):
"""
A play is a language feature that represents a list of roles and/or
task/handler blocks to execute on a given set of hosts.
Usage:
Play.load(datastructure) -> Play
Play.soming(...)
"""
,用task_queue_mar(play)来执行,老规矩,源码的解释。
def run(self, play):
'''
Iterates over the roles/tasks in a play, using the given (or default)
strategy for queueing tasks. The default is the linear strategy, which
operates like classic Ansible by keeping all hosts in lock-step with
a given task (meaning no hosts move on to the next task until all hosts
are done with the current task).
'''
一个完整的例子
# -- coding:utf-8 --
# !/usr/bin/env python
## Author: Shawn.T
# Email: ## this is the Intece package of Ansible2 API
#from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars import VariableMar
from ansible.inventory import Inventory
from ansible.playbook.play import Play
from ansible.executor.task_queue_mar import TaskQueueMar
from tempfile import NamedTemporaryFile
import os
class AnsibleTask(object):
def __init__(self, targetHost):
Options = namedtuple(
'Options', [
'listtags', 'listtasks', 'listhosts', 'syntax', 'connection','module_path',
'forks', 'remote_user', 'private_key_file', 'ssh_common_args', 'ssh_extra_args',
'sftp_extra_args', 'scp_extra_args', 'become', 'become_mod', 'become_user',
'verbosity', 'check'
])
# initialize needed objects
self.variable_mar = VariableMar()
self.options = Options(
listtags=False, listtasks=False, listhosts=False, syntax=False, connection='art',
module_path='/usr/lib/python2.7/site-packages/ansible/modules', forks=100,
remote_user='root', private_key_file=None, ssh_common_args=None, ssh_extra_args=None,
sftp_extra_args=None, scp_extra_args=None, become=False, become_mod=None, become_user='root',
verbosity=None, check=False
)self.passwords = dict(vault_pass='secret')
self.loader = DataLoader()
# create inventory and pass to var mar
self.hostsFile = NamedTemporaryFile(delete=False)
self.hostsFile.write(targetHost)
self.hostsFile.close()
self.inventory = Inventory(loader=self.loader, variable_mar=self.variable_mar, host_list=self.hostsFile.name)
self.variable_mar.set_inventory(self.inventory)
def ansiblePlay(self, action):
# create play with tasks
args = "ls /"
play_source = dict(
name = "Ansible Play",
hosts = 'all',
gather_facts = 'no',
tasks = [
dict(action=dict(module='shell', args=args), register='shell_out'),
dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}')))
])
play = Play().load(play_source, variable_mar=self.variable_mar, loader=self.loader)
# run it
tqm = None
try:
tqm = TaskQueueMar(
inventory=self.inventory,
variable_mar=self.variable_mar,
loader=self.loader,
options=self.options,
passwords=self.passwords,
stdout_callback='default',
)result = tqm.run(play)
finally:
# print result
if tqm is not None:
tqm.cleanup()
os.remove(self.hostsFile.name)
self.inventory.clear_pattern_cache()
return result
写一个ansibleTask类,创建了上述的各类必要的配置信息对象,使用ansibleTask.ansiblePlay()函数执行。
inventory文件的动态生成
写上面的代码的过程中,碰到一个问题:inventory对象创建时需要一个实体的hosts文件,而文件需要动态生成。
生成的方法参考了这篇闪闪的文章。使用tempfile.NamedTemporaryFile这个方法来创建一个有名称的临时文件,可以选择关闭后删除或保留。上面的处理办法是:不删除,在执行完毕之后,通过os.remove(self.hostsFile.name)进行删除。
ps.经YiChenWang指出,inventory的创建参数host_list可以使列表。使用以下方式创建inventory也是可以的:
self.inventory = Inventory(loader=self.loader, variable_mar=self.variable_mar, host_list=['xx.xx.xx.xx', 'xx.xx.xx.xx'])
不过,源码中指出,采用list格式参数是无法加载inventory data的。如果需要加载,还是得使用临时文件的办法。
,jenkins svn和jenkins svn ansible的区别在哪里?
在系统管理页面点击Ma and Assign Roles进入角色管理页面:
1、管理角色(Ma Roles)
选择该项可以创建全局角色、项目角色,并可以为角色分配权限。
如上图,分别创建了admin、anonymous两个全局角色,Online Program、test两个项目角色。
项目角色与全局角色的区别就是,项目角色只能管理项目,没有管理jenkins的权限配置。
添加项目角色时,需要制定匹配项目的模式,如上图中的Pattern,文档介绍该选项支持正则表达式,如“Roger-.”表示所有以Roger-开头的项目,“(?i)roger-.”表示以roger-开头的项目并且不区分大小写,如以ABC开头的项目可以配置为“ABC|ABC.”,也可以使用“abc|bcd|efg”直接匹配多个项目。
2、创建用户
在分配角色之前需要先创建用户。
在系统管理页面,点击管理用户:
点击新建使用者可以创建新用户,如果之前有项目与scm版本管理系统(如svn、git等)连接并获取源码构建过,jenkins会从svn中读取到一些用户信息,可以在查看用户菜单中看到这些用户:
点击用户id或名称都可以修改用户信息。
3、分配角色(Assign Roles)
选择Assign Roles可以为用户分配所属角色,可以分配全局角色和项目角色。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。