Ansible Mercurial克隆挂起

3
当我尝试使用Ansible从Bitbucket克隆存储库时,任务似乎“挂起”了。
文档中,我找到了一些信息,但我没有使用SSH。
如果任务似乎挂起,请首先验证远程主机是否在known_hosts中。SSH将提示用户授权与远程主机的第一次接触。一种解决方案是在.ssh/config中添加StrictHostKeyChecking no,这将代表用户接受和授权连接。但是,如果您运行为不同的用户(例如将sudo设置为True),例如,root将不会查看用户的.ssh/config设置。
这是我尝试过的两个Playbooks,它们都“挂起”了。

Playbook #1

- hosts: staging_mysql
  user: ec2-user
  sudo: yes

  vars_files:
    - vars/mercurial.yml

  tasks:
    - name: Mercurial credentials setup
      action: template src=templates/hgrc.j2 dest=/home/ec2-user/.hgrc

    - name: Install Mercurial
      action: yum name=hg

    - name: Setup API repository
      action: command hg clone https://bbusername@bitbucket.org/username/my-repo -r default --debug

Playbook #2

- hosts: staging_mysql
  user: ec2-user
  sudo: yes

  vars_files:
    - vars/mercurial.yml

  tasks:
    - name: Mercurial credentials setup
      action: template src=templates/hgrc.j2 dest=/home/ec2-user/.hgrc

    - name: Install Mercurial
      action: yum name=hg

    - name: Clone API repo
      hg: dest=/home/ec2-user repo=https://bbusername@bitbucket.org/username/my-repo

欢迎任何帮助。提前致谢!

5个回答

4

对于那些想要克隆私有仓库的人,我找到了更好的答案。Bitbucket有一个称为“部署密钥”的功能。登录到您的项目中,进入“设置”和“部署密钥”。然后点击“添加密钥”,并在项目部署过程中提供此密钥,在hg之前使用。

- file: dest=/var/www/someuser/.ssh/config state=touch mode=600

- lineinfile: dest=/var/www/someuser/.ssh/config
              line="Host bitbucket.org"
              state=present

- copy: src=someuser.key dest=/var/www/someuser/.ssh/id_rsa mode=0600
- copy: src=someuser.key.pub dest=/var/www/someuser/.ssh/id_rsa.pub mode=0600


- lineinfile: dest=/var/www/someuser/.ssh/config
              line="IdentityFile ~/.ssh/id_rsa"

- lineinfile: dest=/var/www/someuser/.ssh/config
              line="    StrictHostKeyChecking no"
              insertafter="Host bitbucket.org"
              state=present

- name: install site code
  hg: repo='ssh://hg@bitbucket.org/somecode'
      dest=someuser
      revision=stable
  tags: someuser_code

line="IdentityFile ~/.ssh/id_rsa" 这个是应该是 "/var/www/someuser/.ssh/id_rsa" 吗? - ajfabbri
根据ssh配置的常规约定,您可以使用shell掩码,因此在上面的片段中,~将与/var/www/someuser相同,在正常情况下应该能够正常工作。 - alex_koval

2

我认为使用HTTPS协议访问BitBucket比使用ssh更容易。如果您在BitBucket中使用私有存储库,还应该使用Ansible创建(或复制)$HOME/.hgrc文件到您的服务器。

以下是.hgrc文件的内容:

[auth]
bb.prefix = https://bitbucket.org/{{ user }}/
bb.username = {{ user }}
bb.password = {{ password }}

两个额外的提示:

  1. 现在在BitBucket的URL中不需要再加上bbusername@
  2. 在BB中创建另一个用户,使其可以访问您的存储库,并将其配置为Ansible主机中的用户。如果有人侵入您的站点,他们将能够修改存储库,但无法删除它。由于一切都是版本控制的,因此您总是可以回滚修改。

1
这个解决方案使用ssh(这样我们就可以使用ssh部署密钥而不是存储https凭据),并预先填充~/.ssh/known_hosts相关条目,以便hg不会在提示接受主机密钥验证时挂起。只要填充正确用户的known_hosts文件,这也适用于是否使用sudo。
# copy the deploy key to ~/.ssh/id_rsa of the ansible user - we use copy here to
# simplify things but really you should use ansible vault or something similar
- name: copy deploy key
  copy: src=id_rsa_deploy dest=/home/{{ ansible_ssh_user }}/.ssh/id_rsa
    owner={{ ansible_ssh_user }} group={{ ansible_ssh_user }} mode=0600

- name: add bitbucket to deploy user's ~/.ssh/known_hosts
  lineinfile: dest=/home/{{ ansible_ssh_user }}/.ssh/known_hosts line="bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw=="

- name: 2 add bitbucket to deploy user's ~/.ssh/known_hosts
  lineinfile: dest=/home/{{ ansible_ssh_user }}/.ssh/known_hosts line="|1|w3ouhSzx3veHkFkoo/0KlzmLWiY=|dyifJ0YlWhJOElkc09kd5ZP2i6c= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw=="

- name: 3 add bitbucket to deploy user's ~/.ssh/known_hosts
  lineinfile: dest=/home/{{ ansible_ssh_user }}/.ssh/known_hosts line="|1|/an77APTih6pDOBpi0GcQ8b5uno=|VOep3g6ll+3Xd8WdUQ/1BqtiF1A= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw=="

- name: copy repo
  hg: repo={{ project.repo }} dest={{ project.local_repo }}

感谢您写出已知主机解决方案。修复了我的卡顿问题。 - sonjz

0

我已经成功解决了这个问题。当以sudo用户登录时,Mercurial任务会“挂起”。 从两个Playbook中删除sudo: yes行后,一切都按预期工作。

有效的Playbook

- hosts: staging_mysql
  user: ec2-user

  vars_files:
    - vars/mercurial.yml

  tasks:
    - name: Mercurial credentials setup
      action: template src=templates/hgrc.j2 dest=/home/ec2-user/.hgrc

    - name: Install Mercurial
      action: yum name=hg

    - name: Clone API repo
      hg: dest=/home/ec2-user repo=https://bbusername@bitbucket.org/username/my-repo

1
иҝҷжҳҜеӣ дёәжӮЁеңЁrootзҡ„known_hostsж–Ү件дёӯжІЎжңүbitbucket.org sshеҜҶй’ҘпјҲз”ұдәҺжӮЁиҜ·жұӮsudoпјҢжүҖд»ҘиҜҘе‘Ҫд»ӨеҸҜиғҪжҳҜд»Ҙrootиә«д»ҪиҝҗиЎҢзҡ„пјҢйҷӨйқһжӮЁеңЁ~/.ansible.cfgдёӯжңүдёҚеҗҢзҡ„й»ҳи®Өи®ҫзҪ®пјүгҖӮ - leucos

0
你实际上是如何访问hg仓库的?尝试在playbook中省略最后一个任务,然后手动登录并尝试hg克隆,看看会发生什么。我怀疑它确实会提示输入密码。

凭据在模板'.hgrc'中,我将其复制到用户目录中。手动克隆正常运行 hg clone https://bbusername@bitbucket.org/username/my-repo - ndequeker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接