TL; DR:是否可以使用一个ansible-playbook命令链接两个剧本,其中一个剧本是密码身份验证而另一个剧本是关键身份验证? (参见上一节的实际目的)。
我有两个剧本,第二个是include
第一个。
---
- name: PlaybookA # requires password authentication
hosts: sub.domain.ext
remote_user: root
roles:
- { role: role1, sudo: yes }
...
---
- name: Run PlaybookA
include: PlaybookA.yml
- name: PlaybookB # requires ssh-key authentication
hosts: sub.domain.ext
remote_user: ansible
roles:
- { role: role2, sudo: yes }
...
在Ansible(版本1.9.4或更低版本)中是否可以执行一个ansible-playbook命令,该命令将使用ssh-key身份验证成功运行PlaybookB,但是当PlaybookB包含PlaybookA时,使用密码身份验证运行PlaybookA?
如果使用Ansible 1.9.4或更低版本无法做到这一点,那么这可能是2.0.0 +?
--ask-pass
(或-k
)作为启用密码身份验证的命令行开关。ask_pass
作为变量,但似乎只能在ansible.cfg
内设置(我无法将其设置为Playbook变量以达到预期效果)。< / LI>
ask_pass
设置为剧本中的指令会产生以下结果:ERROR: ask_pass is not a legal parameter of an Ansible Play
。如果这个参数是合法的,它将提供一种方法来指示每个剧本级别的ansible,使用什么身份验证方法。我正在尝试使用Ansible创建一个配置管理工作流程,该工作流程非常简单,其他工作人员将能够学习/适应它(并希望通常将Ansible用于CM和编排)。
对于任何新建的机器(VM或物理),我打算让我们立即运行两个剧本。 PlaybookA(如上所示)负责使用正确的默认用户登录(通常取决于基础设施[aws,vsphere,none等])。进入后,它的工作非常有限:
根据vm基础结构(或缺少基础结构),默认用户或默认身份验证方法可能不同。为了采用Ansible的目标,我试图让同事们保持极其简单,所以我想尽可能地自动化这种流量控制。
一旦PlaybookA锁定了虚拟机并设置了标准化用户,PlaybookB就会使用该标准化用户执行所需的所有其他操作,以使我们的虚拟机达到必要的工具和实用程序基线等。
任何提示,提示,建议都将不胜感激。
答案 0 :(得分:6)
我今天一直面临同样的问题。有两个想法可以帮到你: 您可以使用playbook中的vars_prompt而不是--ask-pass来请求密码 使用set_fact:
设置密码- name: "set password for the play"
set_fact: ansible_ssh_pass="{{ my_pass }}"
您可以将密码存储在文件中,或提示输入密码,如下例所示。在我的示例中,正在创建的sshd配置将禁止密码登录,但是使用ansible默认值,即使我“忘记”创建authorized_key,您仍会惊讶于第二个剧本仍将被执行(!)。这是因为ansible使用ssh的ControlPersist选项,并且只是保持单个任务之间的连接打开。你可以在ansible.cfg
中关闭它示例手册:
- name: "MAKE BARE: Run preparatory steps on a newly acquired server"
hosts: blankee
tasks:
- name: "set password for the play"
set_fact: ansible_ssh_pass="{{ my_pass }}"
- name: "Create directory {{ pathsts }}/registry/ansible-init"
file: name="{{ pathsts }}/registry/ansible-init" state=directory owner=root group=www-data mode=770
- name: "copy sshd config file"
copy:
src: 'roles/newhost/files/sshd_config'
dest: '/etc/ssh/sshd_config'
owner: 'root'
group: 'root'
mode: '0644'
- name: "Check syntax of sshd configuration"
shell: sshd -t
register: result
changed_when: false
failed_when: "result.rc != 0"
- name: "Restart SSHD and enable Service to start at boot"
service: name=sshd state=restarted
changed_when: false
vars:
my_pass2: foobar
vars_prompt:
- name: "my_pass"
prompt: "########## Enter PWD:\n "
- name: "Second run: This should authenticate w/out password:"
hosts: blankee
tasks:
- name: "Create directory {{ pathsts }}/registry/ansible-init"
file: name="{{ pathsts }}/registry/ansible-init22" state=directory owner=root group=www-data mode=770
答案 1 :(得分:0)
我不知道在播放中更改身份验证方法的方法。我想我更喜欢运行两个不同的剧本作为詹金斯的工作或类似,但我可以想到一个纯粹的Ansible解决方法:你可以得到一个shell命令作为一个本地动作,并运行命令从第一个执行第二个剧本。这是概念的粗略证明:
---
- hosts: all
vars_files:
- vars.yml
tasks:
- debug: msg="Run your first role here."
- name: Then call Ansible to run the second playbook.
local_action: shell ansible-playbook -i ~/workspace/hosts ~/workspace/second_playbook.yml
register: playbook_results
- debug: var=playbook_results.stdout_lines
这是输出:
GATHERING FACTS ***************************************************************
ok: [vagrantbox]
TASK: [debug msg="Run your first role here."] *********************************
ok: [vagrantbox] => {
"msg": "Run your first role here."
}
TASK: [Then call Ansible to run the second playbook.] *************************
changed: [vagrantbox -> 127.0.0.1]
TASK: [debug var=playbook_results.stdout_lines] *******************************
ok: [vagrantbox] => {
"var": {
"playbook_results.stdout_lines": [
"",
"PLAY [Proof of concept] ******************************************************* ",
"",
"GATHERING FACTS *************************************************************** ",
"ok: [vagrantbox]",
"",
"TASK: [debug msg=\"This playbook was called from another playbook!\"] *********** ",
"ok: [vagrantbox] => {",
" \"msg\": \"This playbook was called from another playbook!\"",
"}",
"",
"PLAY RECAP ******************************************************************** ",
"vagrantbox : ok=2 changed=0 unreachable=0 failed=0 "
]
}
}
PLAY RECAP ********************************************************************
vagrantbox : ok=4 changed=1 unreachable=0 failed=0