ansible git

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

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

需要版本控制

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

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

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

那么有哪些可用选项? 最受欢迎的版本控制系统是Mercurial,Subversion和Git 。 每种方法的优缺点不在本系列的讨论范围之内,但是Git已成为开源社区中部署最广泛的源代码控制系统。 有几种流行的选项可供考虑:Stash / Bitbucket(来自Atlassian), GitHub ,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公共密钥

/ home中具有26GB的空间,这是Git存储库所在的位置。

使用Ansible设置Git服务器

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

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

ssh-keygen命令生成SSH密钥。 创建SSH密钥后,可以通过ssh-copy-id user @ host命令将其推送到远程主机。

下一步是安装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

  1. vars:部分, 如上一篇文章中的示例4所示。 在此级别定义的变量在本地范围内
  2. vars文件,如果正在处理的Ansible项目已定义了正确的文件夹结构,则可能会发生这种情况。 (我不会在这里对此进行更深入的介绍,但是您可以阅读有关角色的官方文档以获取更多信息。)
  3. --extra-vars =参数运行剧本。

--extra-vars =参数运行。 要运行剧本,完整命令如下所示:

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

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

数据结构 。 数据结构是指可以存储和访问数据的方式。 Ansible中最常用的类型是列表和字典

[“ 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"

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

启用示例Git存储库

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

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

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

不是幂等的

示例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存储库。

root:root而不是Git用户拥有。)但是,我试图演示几个不同的模块,例如并保持尽可能多的幂等性。 我正在使用的文件模块应该是不言自明的。 要在示例3中运行剧本,请使用以下命令:

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

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

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 }}"

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

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

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

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

翻译自: https://opensource.com/article/17/8/ansible-environment-management

ansible git