Gérer Github: via Terraform vers une solution Ansible personnalisée

Nous avons plus de 350 personnes et plus de 400 référentiels sur Github. Chaque navet peut avoir plusieurs administrateurs, et ils font ce qu'ils jugent bon - naturellement, il arrive qu'une personne ne sache pas ce que fait l'autre. Lorsque nous nous sommes fatigués de regarder le tourment des autres dans l'infrastructure et d'ajouter / supprimer des personnes manuellement, nous avons décidé de passer à la gestion centralisée, Infrastructure as Code.



image



Et nous avons choisi Terraform comme plateforme.



"J'ai des cubes avec les lettres O, P, A ..."



Tout avait l'air lisse sur le papier. Terraform est populaire, il ne devrait pas ĂȘtre difficile de trouver des personnes qui le connaissent. Il a un Ă©tat, et TF apporte les ressources correspondantes - nous pouvons toujours ĂȘtre sĂ»rs que la configuration rĂ©elle est exactement telle que dĂ©crite. Et il n'est plus nĂ©cessaire de monter dans l'interface utilisateur Web - j'ai regardĂ© la configuration et j'ai tout vu.



. TF , . 20 , — Github- API.



, :



  1. .
  2. .
  3. .
  4. .
  5. .
  6. .


.  , Terraform : 1 4. , 2 5. : TF , , .  — , .  , - -   PR, c . 




. . :



resource "github_membership" "membership_for_" {
    username = ""
    role     = "member"
}

resource "github_team" "team_" {
    name           = ""
    description    = ""
    privacy        = "closed"
    parent_team_id = "123456"
}

resource "github_team_membership" "team___membership" {
    team_id  = "${data.terraform_remote_state.teams.team__id}"
    username = ""
    role     = "member"
}

resource "github_repository" "" {
    name          = ""
    description   = ""
    homepage_url  = ""
    has_projects  = false
    has_wiki      = true
    has_issues    = true
    has_downloads = true
    private       = true
    archived      = false
    topics        = ["yii", "school", "mobile"]
}

resource "github_team_repository" "team__repo_" {
    team_id    = "${data.terraform_remote_state.teams.team__id}"
    repository = "${data.terraform_remote_state.repos.repo__name}"
    permission = "push"
}

resource "github_repository_collaborator" "__collaborator" {
    repository = ""
    username   = ""
    permission = "admin"
}


, , - , - .  — .  — . ...



, id.  — — , id .  .  . - .  — ?  .



« » .  — « ».  .  ?  ?  ?  .  , .  , — .



TF, , - . - , . Terraform !  , : TF, - TF.  ...



-, -!



image



— API.  — . , Terraform , 800 , 801 - , , .



  • .
  • , .  resource, value 123456, , .
  • - — , --  .
  • / / — .


YAML





skyeng:
  name: Skyeng
  admin:
    - aleksandr.sergeich

  member:
    - andrey.vadimych
    - denis.andreich
    - mikhail.leonidych
    - vladimir.nickolaich




qa-team:
  privacy: secret

  maintainer:
    - denis.andreich

  member:
    - andrey.vadimych
    - mikhail.leonidych
    - vladimir.nickolaich




alerta:
  description: >-
    Alerta monitoring system
  homepage: https://alerta.io

  teams:
    admin:
      - admin-team

    push:
      - dev-team
      - qa-team

  collaborators:
    direct:
      - denis.andreich

    outside:
      - william.shakespeare


, —



, TF — , 
  Ansible, .



: , — .  CI/CD.  - : , .  .  , .



:



ansible-playbook gitwand.yml
    -e github_repos__state=present
    -e github_repos__include=my_repo


- — :



ansible-playbook gitwand.yml
    -e github_teams__state=present
    -e github_teams__include=my_team


, github_teams__include.



.  LDAP, , , .  , , , - .  Github-.





.




All Articles