如何在 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!
我让最终用户要么提供用户名,即 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!