我想根据最终用户给出的值从 ansible 部署多个虚拟机
I wanted to deploy multiple VMs from ansible, from values given by the enduser
我想从我的 ansible-playbook 部署多个 VMS,所以我使用了 split 函数,但我得到了 dict does not have user_inout 错误。请看看我的代码。
代码:
- name: os system
pause:
prompt: |
Which os do you want to use?
1- Windows Server
2- CentOS_7
3- CentOs_8
4- Ubuntu
5- Others
register: os_system
- set_fact:
o_name: "{{ os_system.user_input.split(',') }}"
- name: Domain Decision
pause:
prompt: Do you want your PC in Domain
register: decision
when: 'item|string == "1"'
with_items:
- "{{ o_name }}"
- set_fact:
dec: "{{ decision.user_input.split(',') }}"
现在我的真正问题是,如果用户选择选项 1,2,那么它将被 set_fact 拆分为 os_system,并且根据该输入它将决定域决策我的主要问题是当任务在 set_fact 进行决策时,它会给我这样的错误:
错误:
致命的:[x.x.x.x]:失败! => {
"msg": "任务包含一个带有未定义变量的选项。错误是:'dict object' 没有属性 'user_input'\n\nThe 错误似乎在 '/home/x.x.x.x/sites/playbook.yml':第 82 行,第 6 列,但 may\nbe 在文件的其他位置,具体取决于确切的语法问题。\n\nThe 违规行似乎是:\n\n\n - set_fact:\n ^ here\n"
}
如果我从任务域决策中删除循环,那么 set_fact 工作得非常完美。
当你想收集用户输入时,可以有两种方式:
- 交互式(提示),使用
vars_prompt
。
- 通过变量(non-prompted)。例如,您可以让用户创建一个包含变量的文件并加载
vars_file
.
如果可能的话,我更喜欢第二种方法。
但是,要通过提示以交互方式获取用户输入:
- hosts: my_hosts
vars_prompt:
- name: os_system
prompt: |
Which os do you want to use?
1- Windows Server
2- CentOS_7
3- CentOs_8
4- Ubuntu
5- Others
private: no
tasks:
- set_fact:
o_name: "{{ os_system.split(',') }}"
您应该注意,通过拆分 1,2 的输入 - 您不会得到 OS 名称。您将再次必须根据数字设置一个事实(1 = Windows 服务器)。恕我直言,这是不必要的并发症。
更好的选择是让用户创建如下所示的变量文件:
my_vars.yml:
os_choices:
- { name: Windows Server, domain: yes }
- { name: CentOS_7, domain: no }
并在游戏中加载它:
- hosts: my_hosts
vars_file:
- my_vars.yml
我想从我的 ansible-playbook 部署多个 VMS,所以我使用了 split 函数,但我得到了 dict does not have user_inout 错误。请看看我的代码。
代码:
- name: os system
pause:
prompt: |
Which os do you want to use?
1- Windows Server
2- CentOS_7
3- CentOs_8
4- Ubuntu
5- Others
register: os_system
- set_fact:
o_name: "{{ os_system.user_input.split(',') }}"
- name: Domain Decision
pause:
prompt: Do you want your PC in Domain
register: decision
when: 'item|string == "1"'
with_items:
- "{{ o_name }}"
- set_fact:
dec: "{{ decision.user_input.split(',') }}"
现在我的真正问题是,如果用户选择选项 1,2,那么它将被 set_fact 拆分为 os_system,并且根据该输入它将决定域决策我的主要问题是当任务在 set_fact 进行决策时,它会给我这样的错误:
错误: 致命的:[x.x.x.x]:失败! => { "msg": "任务包含一个带有未定义变量的选项。错误是:'dict object' 没有属性 'user_input'\n\nThe 错误似乎在 '/home/x.x.x.x/sites/playbook.yml':第 82 行,第 6 列,但 may\nbe 在文件的其他位置,具体取决于确切的语法问题。\n\nThe 违规行似乎是:\n\n\n - set_fact:\n ^ here\n" }
如果我从任务域决策中删除循环,那么 set_fact 工作得非常完美。
当你想收集用户输入时,可以有两种方式:
- 交互式(提示),使用
vars_prompt
。 - 通过变量(non-prompted)。例如,您可以让用户创建一个包含变量的文件并加载
vars_file
.
如果可能的话,我更喜欢第二种方法。
但是,要通过提示以交互方式获取用户输入:
- hosts: my_hosts
vars_prompt:
- name: os_system
prompt: |
Which os do you want to use?
1- Windows Server
2- CentOS_7
3- CentOs_8
4- Ubuntu
5- Others
private: no
tasks:
- set_fact:
o_name: "{{ os_system.split(',') }}"
您应该注意,通过拆分 1,2 的输入 - 您不会得到 OS 名称。您将再次必须根据数字设置一个事实(1 = Windows 服务器)。恕我直言,这是不必要的并发症。
更好的选择是让用户创建如下所示的变量文件:
my_vars.yml:
os_choices:
- { name: Windows Server, domain: yes }
- { name: CentOS_7, domain: no }
并在游戏中加载它:
- hosts: my_hosts
vars_file:
- my_vars.yml