无法根据Ansible中的条件设置set_fact变量

时间:2019-09-06 04:28:25

标签: variables ansible conditional-statements

应该根据{{command_result.stdout.split('\ t')[1]}}的输出为MYUSER分配值“ wsadm”或“ user1” 我尝试了以下操作,但是运行时出现错误。

我的剧本如下所示:

---
- name: "Play 1-Find the details here"

  hosts: localhost
  gather_facts: no
  tasks:

   - name: "Search for {{ Number }} in the database"
     command: >
       mysql --user=root --password=mypass deployment
       --host=localhost  -Ns -e "SELECT dest_ip,layer FROM deploy_dets WHERE num LIKE '{{ Number }}'"
     register: command_result

   - set_fact:

       dest_ip: "{{ command_result.stdout.split('\t')[0] }}"
       MYUSER: "wsadm"
     when: {{ command_result.stdout.split('\t')[1] }} == 'WAS'
       MYUSER: "user1"
     when: {{ command_result.stdout.split('\t')[1] }} == 'APP'

   - name: "Print output for Number Search"
     debug:
       msg: "{{ command_result.stdout.split('\t')[1] }}"
       msg: "{{ MYUSER }}"

错误输出:

  

[警告]:提供的主机列表为空,只有localhost可用。   请注意,隐式本地主机与“所有”错误不匹配!句法   加载YAML时出错。找不到预期的密钥错误   似乎在   '/app/axmw/Ansible/playbook/finacle_deployment/assignvars.yml':第   22,第57列,但取决于确切的位置,可能在文件的其他位置   语法问题。令人反感的行似乎是:          MYUSER:“ wsadm”        时间:“ {{command_result.stdout.split('\ t')[1]}}” =='WAS'                                                           ^这里我们可能是错的,但是这看起来可能是一个问题   缺少引号。总是在引用模板表达式括号时   开始一个值。

我也尝试了以下方法,但是它们也没有帮助:

第一:

   MYUSER: "wsadm"
 when: "{{ command_result.stdout.split('\t')[1] }}" == 'WAS'
   MYUSER: "user1"
 when: "{{ command_result.stdout.split('\t')[1] }}" == 'APP'        

第二:

   MYUSER: "wsadm"
 when: command_result.stdout.split('\t')[1] == 'WAS'
   MYUSER: "user1"
 when: command_result.stdout.split('\t')[1] == 'APP'

第三:

   layer: "{{ command_result.stdout.split('\t')[1] }}"
   MYUSER: "wsadm"
 when: layer == 'WAS'
   MYUSER: "user1"
 when: layer == 'APP'

我正在使用最新版本的ansible。

你能建议吗?

2 个答案:

答案 0 :(得分:0)

尝试这个

when: "command_result.stdout.split('\t')[1] == 'APP'"

确保command_result.stdout.split('\t')[1]给您您真正想要的东西

- debug:
    msg: "{{ command_result.stdout.split('\t')[1] }}"

答案 1 :(得分:0)

您有与清单文件相关的错误,如以下错误所示。

  

[警告]:提供的主机列表为空,只有localhost可用。   请注意,隐式本地主机与“所有”错误不匹配!句法   加载YAML时出错

此外,您的ansible剧本中有语法错误,从该错误中可以明显看出。

  

冒犯的行似乎是:MYUSER:“ wsadm”,当:“ {{   command_result.stdout.split('\ t')[1]}}“” =='WAS'^

我首先要引起您注意的是,我们应该避免在when condition中使用jinja2模板。

我为您写了一本小剧本,其中包含一个变量,并根据\t对其进行拆分,以适合您的用例。

---
- hosts: localhost
  gather_facts: no
  vars:
    - user: "user:  WAS"
  tasks:
    - debug:
        msg: "{{ user }}"

    - set_fact:
        MYUSER: "wsadm"
        when: user.split('\t')[1] == "WAS"

    - debug:
        msg: "{{ MYUSER }}"

输出

TASK [debug] *********************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "user:\tWAS"
}
Saturday 07 September 2019  06:57:29 +0000 (0:00:00.081)       0:00:00.218 **** 

TASK [set_fact] ******************************************************************************************************************************************************************
ok: [localhost]
Saturday 07 September 2019  06:57:29 +0000 (0:00:00.064)       0:00:00.283 **** 

TASK [debug] *********************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "wsadm"
}

还要牢记首先检查@Vladimir Botka建议的变量中是否要获取正确的值

希望有帮助。