通过盐柱将ssh密钥从主服务器部署到小仆服务器


11

我有两个ssh密钥,我正尝试将它们部署到我的一个奴才上。但是我似乎无法部署它。它出错了。这是init.sls支柱:

/xxx/yyy/zzz/id_rsa:
  file.managed:
    - source: salt://private/id_rsa

/xxx/yyy/zz/id_rsa.pub:
  file.managed:
    - source: salt://private/id_rsa.pub

这是我的init.sls状态:

ssh:
  file.managed:
    - name: {{ pillar['private'] }}

我一定做错了(显然),但是我不确定是什么。有什么建议?


我想提供帮助,但是我无法使用所提供的信息进行回答。部分原因是yaml格式。编辑您的问题,但在每个代码块的上方和下方保留一个空白链接,然后在代码块的每一行缩进至少4个空格。第二,您是否已经成功地做到了在方程式中没有支柱?我从未见过像您那样拥有支柱数据的方法。
Dan Garthwaite

您找到问题的答案了吗?
Dan Garthwaite

是的,我相信我做到了
secure212

Answers:


13

Salt Pillar系统没有init.sls文件。状态和支柱都有一个top.sls文件。属于子目录的状态可能具有init.sls文件。

步骤1:在/srv/pillar/users.sls中定义您的用户

users:

  - name: fred
    fullname: Fred Flintstone
    email: fflintstone@slaterockandgravel.com
    uid: 4001
    gid: 4001
    shell: /bin/bash
    groups:
      - bowling
    shadow: $6$Sasdf/Ss$asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfsadfasdfsadfsadfsdf
    authkey: ssh-dss AAAAasdfasdfsadfsadfsadfsadfasdfasdfsdafsdafaasdfasdfasdfasdfasdfsadfsadfsadfsadfasdfasdfsdafsdafaasdfasdfasdfasdfasdfsadfsadfsadfsadfasdfasdfsdafsdafaasdfasdfasdfasdfasdfsadfsadfsadfsadfasdfasdfsdafsdafa = fflinstone@slaterockandgravel.com
    sshpub: ssh-dss AAAAasdfasdfsadfsadfsadfsadfasdfasdfsdafsdafaasdfasdfasdfasdfasdfsadfsadfsadfsadfasdfasdfsdafsdafaasdfasdfasdfasdfasdfsadfsadfsadfsadfasdfasdfsdafsdafaasdfasdfasdfasdfasdfsadfsadfsadfsadfasdfasdfsdafsdafa = fflinstone@slaterockandgravel.com

  - name: barney
    fullname: Barney Rubble
    email: brubbel@slaterockandgravel.com
    uid: 4002
    gid: 4002
    shell: /bin/bash
    groups:
      - bowling
    shadow: $6$Suiop/Ss$uiopuiopuiopuiopuiopuiopuiopuiopuiopuiopuiopsadfuiopsadfsadfsdf
    authkey: ssh-dss AAAAuiopuiopsadfsadfsadfsadfuiopuiopsdafsdafauiopuiopuiopuiopuiopsadfsadfsadfsadfuiopuiopsdafsdafauiopuiopuiopuiopuiopsadfsadfsadfsadfuiopuiopsdafsdafauiopuiopuiopuiopuiopsadfsadfsadfsadfuiopuiopsdafsdafa = fflinstone@slaterockandgravel.com
    sshpub: ssh-dss AAAAuiopuiopsadfsadfsadfsadfuiopuiopsdafsdafauiopuiopuiopuiopuiopsadfsadfsadfsadfuiopuiopsdafsdafauiopuiopuiopuiopuiopsadfsadfsadfsadfuiopuiopsdafsdafauiopuiopuiopuiopuiopsadfsadfsadfsadfuiopuiopsdafsdafa = fflinstone@slaterockandgravel.com

步骤2:将新支柱添加到/srv/pillar/top.sls

base:
  'testminion':
    - users

步骤3:使用jinja将支柱映射到/srv/salt/user/init.sls中的状态

{% for user in pillar['users'] %}
user_{{user.name}}:
  group.present:
    - name: {{user.name}}
    - gid: {{user.gid}}

  user.present:
    - name: {{user.name}}
    - fullname: {{user.fullname}}
    - password: {{user.shadow}}
    - shell: {{user.shell}}
    - uid: {{user.uid}}
    - gid: {{user.gid}}
    {% if user.groups %}
    - optional_groups:
      {% for group in user.groups %}
      - {{group}}
      {% endfor %}
    {% endif %}
    - require:
      - group: user_{{user.name}}

  file.directory:
    - name: /home/{{user.name}}
    - user: {{user.name}}
    - group: {{user.name}}
    - mode: 0751
    - makedirs: True

user_{{user.name}}_forward:
  file.append:
    - name: /home/{{user.name}}/.forward
    - text: {{user.email}}

user_{{user.name}}_sshdir:
  file.directory:
    - name: /home/{{user.name}}/.ssh
    - user: {{user.name}}
    - group: {{user.name}}
    - mode: 0700

{% if 'authkey' in user %}
user_{{user.name}}_authkeys:
  ssh_auth.present:
    - user: {{user.name}}
    - name: {{user.authkey}}
{% endif %}

{% if 'sshpriv' in user %}
user_{{user.name}}_sshpriv:
  file.managed:
    - name: /home/{{user.name}}/.ssh/id_rsa
    - user: {{user.name}}
    - group: {{user.name}}
    - mode: 0600
    - contents_pillar: {{user.sshpriv}}
{% endif %}

{% if 'sshpub' in user %}
user_{{user.name}}_sshpub:
  file.managed:
    - name: /home/{{user.name}}/.ssh/id_rsa.pub
    - user: {{user.name}}
    - group: {{user.name}}
    - mode: 0600
    - contents_pillar: {{user.sshpub}}
{% endif %}
{% endfor %} # user in users
# vim: ft=yaml tabstop=2 sts=2 sw=2 et ai si

不要忘记将奴才与新支柱同步!

salt targetminions saltutil.refresh_pillar

我无法使该示例在Salt 2014.7.1上运行;它似乎给出了一个错误:“ Jinja变量'str对象'没有属性'name'”。我已采取措施在user / init.sls中执行以下操作: {% for user, data in salt['pillar.get']('users', {}).iteritems() %}这将显着改变整个sls文件;如果我想出一个可行的例子,我会发布它。
Mike S

后续行动:亲爱的Traveller,如果您希望利用此代码,我相信它存在许多错误。例如,“ fred”和“ barney”之后的冒号将使盐bar倒,“ end for”和“ end if”也会结束(它们中不应有空格)。再次,我怀疑最初的构造错误,但目前我对盐知之甚少,所以我不确定。警告程序员。对于我自己,我将使用iteritems()概念。
Mike S

抱歉,丹,我仍然遇到问题:数据编译失败:----------渲染SLS'base:users'失败:运行时Jinja变量'str object'没有属性'name':salt testminion state.highstate test = True...。我在上面逐字复制了您的文本。唯一的增加是我的/srv/salt/top.sls文件,它是一个简单的3层代码(base:,'*':和-users)。
Mike S

我将启动一个docker容器并进行分类,除非您先进入它?
Dan Garthwaite 2015年

“数据编译失败”是由于/srv/pillar/top.sls中文件名后缀“ .sls”引起的。比我还遇到了问题。请注意,我已经重写了很多内容。我现在暂时必须删除user.sshpriv,这已经很晚了,我一直在---文本内容方面遇到麻烦。
Dan Garthwaite 2015年

1

这也许应该指出的是,相对于原来的问题,还有另一种简单的解决方案,如果source: salt://...格式不一起工作file.managed-因为它仍然有发生salt-ssh,因为错误的https://github.com/saltstack/salt/issues/38458这是自固定以来-即contents:使用文件树外部支柱切换,该支柱也由主服务器上的文件支持。

如今,该file_tree ext_pillar文件已在https://docs.saltstack.com/zh-CN/latest/ref/pillar/all/salt.pillar.file_tree.html#module-salt.pillar.file_tree中记录。它自2015.5.0版本以来已经存在,因此它比原始的问题和答案要新,但是它是当今相当可用的解决方案。

实际上,它也位于FAQ中,网址https://docs.saltstack.com/en/latest/faq.html#is-it-possible-to-deploy-a-file-to-a-specific-minion-without其他小兵可以访问它

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.