如何在 ansible 动态清单中合并密码和无密码登录

How to incorporate password along with passwordless login in ansible dynamic inventory

我让最终用户要么提供用户名,即 dest_user,其 ssh-keys 已经在 Linux 上为所有目标主机设置,即 dest_host

以下是我如何为无密码用户设置动态清单

- add_host:
    name: "{{ item }}"
    groups: dest_nodes
    ansible_user: "{{ dest_user }}"
  with_items: "{{ dest_host.split() }}"
  when: dest_user != ""

一切顺利。第二种情况是当用户没有提供任何 dest_user 时,他的 SSO 用户名(我从他们的 Jenkins 登录中得到)和密码,即他手动输入的 dest_pass 应该用于动态库存。

如何构建 dest_nodes 组以同时容纳无密码登录的用户名和 SSO 登录的用户名密码?

您可以使用 pause module, and use the special variable omit 有条件地提示变量,使 ansible_password 在您的 add_host 任务中可选。

注意:由于您似乎对从 Jenkins 获取用户的方式有一个很好的想法,我假设它在变量 dest_user_from_jenkins 中,在这里。

这里有两个任务:

- pause:
    prompt: Please enter your password
    echo: no
  register: dest_pass
  when: dest_user | default('') == ''

- add_host:
    name: "{{ item }}"
    groups: dest_nodes
    ansible_user: "{{ dest_user | default(dest_user_from_jenkins) }}"
    ansible_password: "{{ dest_pass.user_input | default(omit) }}"
  loop: "{{ dest_host.split() }}"

鉴于剧本:

- hosts: localhost
  gather_facts: no
  vars:
    dest_host: foo bar
    dest_user_from_jenkins: dest_user_not_set

  tasks:
    - pause:
        prompt: Please enter your password
        echo: no
      register: dest_pass
      when: dest_user | default('') == ''

    - add_host:
        name: "{{ item }}"
        groups: dest_nodes
        ansible_user: "{{ dest_user | default(dest_user_from_jenkins) }}"
        ansible_password: "{{ dest_pass.user_input | default(omit) }}"
      loop: "{{ dest_host.split() }}"

    - debug:
        msg: |
          user: {{ hostvars[item].ansible_user }}
          password: {{ 
            hostvars[item].ansible_password 
              | default('password has not been set!') 
          }}
      loop: "{{ groups['dest_nodes'] }}"

我们最终有两条可能的路径:

  • 当 运行 没有任何额外参数时,这会产生:
    TASK [pause] ***********************************************************
    [pause]
    Please enter your password (output is hidden):
    ok: [localhost]
    
    TASK [add_host] ********************************************************
    ok: [localhost] => (item=foo)
    ok: [localhost] => (item=bar)
    
    TASK [debug] ***********************************************************
    ok: [localhost] => (item=foo) => 
      msg: |-
        user: dest_user_not_set
        password: password
    ok: [localhost] => (item=bar) => 
      msg: |-
        user: dest_user_not_set
        password: password
    
  • 当 运行 和 --extra-vars "dest_user=dest_user_set" 时,这会产生:
    TASK [pause] ***********************************************************
    skipping: [localhost]
    
    TASK [add_host] ********************************************************
    ok: [localhost] => (item=foo)
    ok: [localhost] => (item=bar)
    
    TASK [debug] ***********************************************************
    ok: [localhost] => (item=foo) => 
      msg: |-
        user: dest_user_set
        password: password has not been set!
    ok: [localhost] => (item=bar) => 
      msg: |-
        user: dest_user_set
        password: password has not been set!