博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ansible git_如何使用Ansible通过SSH设置Git服务器
阅读量:2528 次
发布时间:2019-05-11

本文共 9886 字,大约阅读时间需要 32 分钟。

ansible git

在本系列的中,我描述了Ansible远程管理工具的基础。 我设置了环境,在控制计算机上安装了Ansible软件包,设置了基本清单,并演示了基本的剧本。 我不需要备份这些简单且易于复制的剧本,但是随着这些剧本开始成为我的实验环境的蓝图和文档,我将需要考虑如何备份它们。

复制
systemd
service
apt
yum
virt
用户模块,但为了使内容更突出重点,我决定将大部分讨论移至后续文章中,并探讨使用Ansible的另一种方式:设置用于版本控制的Git SSH服务器。

需要版本控制

版本控制是一种跟踪可能对文件,文件系列或项目进行的更改的方法。 通常,版本控制系统存储基本信息,例如:

  • 哪个用户进行了更改,
  • 何时进行更改,以及
  • 更改了哪些文件。

这可能是至关重要的信息,尤其是与还原更改功能结合使用时,从长远来看将为您节省很多麻烦。

那么有哪些可用选项? 最受欢迎的是Mercurial,Subversion和 。 每种方法的优缺点不在本系列的讨论范围之内,但是Git已成为开源社区中部署最广泛的源代码控制系统。 有几种流行的选项可供考虑:Stash / Bitbucket(来自Atlassian), ,GitLab和Perforce with Git(以及许多其他公司实现)。 它们都具有不错的Web前端,适合团队协作。 但是,他们也参与了更多的工作。

Git确实提供了另一个优势。 您可以在局域网上的安全外壳(SSH)上运行Git服务器,该服务器的设置和管理较为简单,并且对硬件资源的要求也很低。

Git SSH服务器要求

Git SSH服务器的硬件要求最低。 实际上,没有提供服务器规格。 任何具有网络连接且正在运行能够安装Git的Linux发行版的计算机都可以提供Git SSH服务。

在软件方面,Git服务器需要以下设置:

  1. 安装在将用作Git SSH服务器的计算机上的Git软件包
  2. SSH已安装并配置为允许通过SSH密钥进行连接
  3. Git SSH服务器上的专用用户,通过SSH提供对服务器的访问(按照惯例,通常是git用户)
  4. 上一步中为专用用户安装在authorized_keys文件中的所有客户端的SSH公共密钥

我的Git SSH服务器是CentOS 7.3 VM,在/ home中具有26GB的空间,这是Git存储库所在的位置。

使用Ansible设置Git服务器

对于家庭或实验室环境而言,使用Ansible设置Git SSH服务器可能会显得有些过时,但是它确实具有两个重要功能:

  1. 它提供了扩展一些更高级的Ansible主题的途径。
  2. 它提供了一组可重复的步骤,这些步骤(由于Ansible的性质)是自我记录的。 这意味着Git SSH服务器的复制应该很简单。

第一步是将SSH密钥从Ansible控制机器复制到Git SSH服务器。 作为更新,可以使用ssh-keygen命令生成SSH密钥。 创建SSH密钥后,可以通过ssh-copy-id 命令将其推送到远程主机。

下一步是安装Git软件包。 示例1演示了一个简单的剧本来完成此任务。

示例1:软件包安装手册

- hosts:      
"{
{ hostname }}"
  gather_facts: False
  vars:
    - packages:
[
"git" ,
"nmap"
]
  tasks:
    - name: Installing
{
{
packages
}
} on
{
{
hostname
}
}
      yum:
        name:
"{
{ item }}"
        state: present
      with_items:
"{
{ packages }}"

Ansible变量简介

此剧本同时使用已定义(例如package )和未定义(例如hostname )变量。 Ansible可以通过几种方式初始化任意变量(即,Ansible收集事实时未定义的变量):

  1. 使用剧本的vars:部分, 中的示例4所示。 在此级别定义的变量在本地范围内 ,这意味着它们仅可用于直接操作手册,而不能用于后续操作手册。
  2. 定义vars文件,如果正在处理的Ansible项目已定义了正确的文件夹结构,则可能会发生这种情况。 (我不会在这里对此进行更深入的介绍,但是您可以阅读的获取更多信息。)
  3. 使用--extra-vars =参数运行剧本。

示例1中的剧本设计为使用--extra-vars =参数运行。 要运行剧本,完整命令如下所示:

ansible-playbook install_git.yaml      
--extra-vars =
"hostname=git"

这种传递变量的方法是最灵活的,并且对于特定类型的剧本,可能是最理想的。

变量不仅可以用字符串定义; Ansible还支持数据结构 。 数据结构是指可以存储和访问数据的方式。 Ansible中最常用的类型是列表字典

列表由方括号内的一系列变量表示。 在示例1中, [“ git”,“ nmap”]在称为packages的列表中定义。 字典用花括号( {} )定义,并使用键值对表示法,看起来像这样: {用户名:jdoe,组:用户}在此,我将不涉及何时使用每种类型的数据结构系列,但重要的是要意识到Ansible支持多种类型。

注意:NMAP实用程序包含在示例1中,只是为了演示Ansible中列表的定义。

这个小手册中介绍的最后一个新概念是with_items:行。 这是Ansible中的有用功能。 它类似于for循环的想法。 Ansible将遍历列表中的每个项目并根据该项目采取行动; 但是,与其他编程语言不同,您可能无法定义循环中使用的变量的名称。 在Ansible中,循环变量始终是单词item

最后,您可能已经注意到,可以在任务名称中使用一些变量。 这有助于在Ansible运行期间提供描述性输出。 例如,以下是示例1中剧本的任务输出:

TASK      
[ Installing
[ u
'git' , u
'nmap'
]
] on
git
*************************************************************
changed:
[
git
] =
>
(
item =
[ u
'git' , u
'nmap'
]
)

尽管该列表只是简单地转换为任务名称中的文本,但是运行剧本的人可以告诉正在将哪些软件包安装到哪个主机。

使用Ansible创建用户

下一步是创建git用户。 以下剧本将这样做:

示例2:创建Git用户

- hosts:      
"{
{ hostname }}"
  gather_facts:
false
  tasks:
    - name: create and
/ or change
{
{
username
}
}
's  password       user:         name: "{
{ username }}"         password: MYg1tpassw0rd

该剧本在运行时还依赖--extra-vars =参数。 与之前类似,该剧本将运行:

ansible-playbook user_setup_with_params.yaml      
--extra-vars =
"hostname=git username=git"

本手册介绍了 ,该具有更多选项,可以根据需要传递。 该模块的功能完全符合您的预期,因此这里没有太多要讨论的内容。 与Unix等效命令一样,用户模块可用于在系统上创建,管理或删除本地用户。 一般来说,如果您的用户是集中管理的(例如在Active Directory或LDAP中),则不应使用此模块。

启用示例Git存储库

要完全支持正常运行的Git SSH服务器,还有两个步骤:

  1. 创建一个示例裸仓库,供用户进行协作。
  2. 启用对Git用户的SSH访问,以便人们可以提交和删除剧本。

为了创建Git存储库,示例3中的剧本演示了 (它只运行shell命令,就像您在终端中键入它们一样)和 。 尽管Ansible通常具有用于大多数任务的本机模块(例如 ),但有时该模块可能无法完全满足您的期望。 在这些情况下,可以使用命令模块。

警告:命令模块不是 ! 这意味着命令模块将运行,而不管任务之前是否完成。 在某些情况下,例如处理SSL证书,多次发出同一命令可能会产生意外的副作用。

示例3:创建初始Git存储库

- hosts:      
"{
{ hostname }}"
  gather_facts: False
  tasks:
    - name:
git init
--bare
{
{
project
}
} with the
command module
      command:
git init
--bare
{
{
project
}
}
      args:
        chdir:
"{
{ git_base_dir }}"
      become_user:
git
   
    - name: Set the permissions on
{
{
git_base_dir
}
}
/
{
{
project
}
}
      file:
        path:
"{
{ git_base_dir }}/{
{ project }}"
        state: directory
        mode: 0755
        owner:
git
        group:
git
        recurse: True

注意第一个任务的args:chdir:部分。 这些是给命令模块的可选指令。 正如人们所期望的那样, chdir: 运行命令之前将当前工作目录更改为指定的位置。 这样可以确保在所需位置创建Git存储库。

在示例3中,我还可以使用命令模块来设置目录的权限。 (使用命令模块时的默认权限是从当前的Ansible用户继承的。在这种情况下,存储库本应由root:root而不是Git用户拥有。)但是,我试图演示几个不同的模块,例如并保持尽可能多的幂等性。 我正在使用的文件模块应该是不言自明的。 要在示例3中运行剧本,请使用以下命令:

ansible-playbook initialize_git.yaml --extra-vars = "hostname=git git_base_dir=/home/git/ project=newgitproject"

Git基础

要使用新安装的Git服务器,每个需要提交代码的用户必须将其SSH密钥安装到远程主机上git用户的authorized_keys文件中。

可以使用几种方法来管理SSH密钥的传播。

示例4:使用带有文件glob的authorized_key模块进行SSH密钥传播

- hosts:      
"{
{ hostname }}"
  gather_facts:
false
  tasks:
    - name: copy
ssh key using FILEGLOB
      authorized_key:
        key:
"{
{ lookup('file', item) }}"
        user:
"{
{ username }}"
        state: present
        exclusive: False
      with_fileglob: ..
/ files
/* .pub

在示例4中, fileglob模块允许传播目录中的所有SSH密钥。 在这种情况下,示例4中的剧本将推送以.pub结尾的任何SSH密钥。 当您有很多要推送的SSH密钥并且不想全部列出它们时,这很有用。

示例5:使用with_items使用authorized_key模块进行SSH密钥传播

- hosts:      
"{
{ hostname }}"
  gather_facts:
false
  vars:
    ssh_keyfile:
[
"user1_ssh_key.pub" ,
"user2_ssh_key.pub"
]
  tasks:  
    - name: copy
ssh key using ITEM NAME
      authorized_key:
        key:
"{
{ lookup('file', '../files/'+item) }}"
        user:
"{
{ username }}"
        state: present
        exclusive: False
      with_items:
        -
"{
{ ssh_keyfile }}"

在示例5中,每个键都是通过列表ssh_keyfile通过名称指定的。 它使用with_items遍历ssh_keyfile列表中的每个键。 这种方法的优点是必须故意添加每个密钥,而不是将每个密钥文件推送到目录中。 由于key:属性是在authorized_key模块内部形成的方式,因此该方法要求所有密钥都位于同一目录中。

图6:使用with_file的authorized_key模块进行SSH密钥传播

- hosts:      
"{
{ hostname }}"
  gather_facts:
false
  tasks:
    - name: using with_file
      authorized_key:
        key:
"{
{ item }}"
        user:
"{
{ username }}"
        state: present
        exclusive: False
      with_file:
        - ..
/ files
/ user1_ssh_key.pub
        - ..
/ files
/ user2_ssh_key.pub

示例6引入了with_file的概念。 它与示例5类似,不同之处在于它不需要键位于同一目录中。 从技术的角度来看,这些方法在本质上都不比其他方法更好。 每种方法都涉及安全性和维护性,应逐案考虑。 对于家庭安装中的小型安装,所有这些方法都是完全可以接受的。 要运行以上任何一部剧本,请使用以下命令:

ansible-playbook install_ssh_keys.yaml      
--extra-vars =
"hostname=git username=git"

现在已经在Git SSH服务器上安装了SSH密钥,您的用户已经准备好签出代码并开始为新项目做贡献。 要从Git SSH服务器上拉下newgitproject项目,请发出以下命令(以使用示例4、5或6中的一种方法安装了SSH密钥的用户身份)。

[ user      
@ host ~
] $
git clone ssh:
//
git
@ git
/ home
/ git
/ newgitproject

您将收到以下输出:

Cloning into      
'newgitproject' ...
warning: You appear to have cloned an empty repository.

我将创建一个空文件来演示该过程:

cd newgitproject     
touch test.txt

接下来,将文件添加到Git进行跟踪:

git add test.txt     
git commit
-m
"first commit of test.txt

您将看到如下所示的输出:

Committer: somecomment      
< user
@ host
>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly. Run the
following
command and follow the instructions
in your editor to edit
your configuration file:
   
git config
--global
--edit

完成此操作后,您可以使用以下命令修复用于此提交的身份:

git commit      
--amend
--reset-author
1
file changed,
0 insertions
( +
) ,
0 deletions
( -
)
 create mode
100644 test.txt

的提供了有关配置Git客户端的信息。 但是,您仍然可以在不使用Git配置选项的情况下推送到Git SSH服务器。 如果使用git log ,应该会看到类似以下内容:

commit f9bd46c57211fa5c35831bbe0ce1f9c0a34a0eba     
Author: somecomment
< user
@ host
>
Date:   Wed Jul
12 08:
41 :
20
2017
-0400
    first commit of test.txt

此时,您应该已经可以使用Git SSH服务器。 作为最佳实践,每次对剧本进行更改时,都应将其检入Git服务器。 这样既可以跟踪您的更改,又可以在出现问题时轻松回滚。

下一步

我已经讲解了Ansible管理系统所需的一些技能。 在下一篇文章中,我将开始使用进行监视以进行数据收集,并使用进行监视以进行数据可视化。 我将使用各种Ansible模块来完成这些任务,这将为您提供扎实的基础,您可以从中创建自己的剧本。

翻译自:

ansible git

转载地址:http://ogszd.baihongyu.com/

你可能感兴趣的文章
MyBatis单表增删改查--接口实现
查看>>
洛谷 P1114 “非常男女”计划
查看>>
Android中实现Activity的透明背景效果
查看>>
网络流(最大流) CQOI 2015 BZOJ 3931 网络吞吐量
查看>>
2016年1月全国网络媒体技术联盟第七届年会的几个关键词
查看>>
BugBugBugBugBugBugBugBugBugBugBugBugBugBugBug
查看>>
LINUX 编译安装 PHP 环境
查看>>
Vue开源项目库汇总-转
查看>>
作业4(第二部分)
查看>>
我需要一个足够大的桌子
查看>>
[BZOJ4523]路由表
查看>>
js 正则,从url中取参数值
查看>>
《Head First Servlets & JSP》-11-Web应用部署
查看>>
android之volley学习
查看>>
C++中析构函数的作用,
查看>>
Jupyter
查看>>
java中long类型转换为int类型
查看>>
Viewbox在UWP开发中的应用
查看>>
给你的应用“一只”智慧的眼睛 —— Barcode常识普及以及识别信息处理
查看>>
PHP基础知识点汇总(三)
查看>>