代码之家  ›  专栏  ›  技术社区  ›  Jeremiah Williams

Ansible:向循环中的变量添加值

  •  0
  • Jeremiah Williams  · 技术社区  · 7 年前

    1. 从文件中提取文本并将其添加到变量中
    2. 对变量执行检查以查看是否存在文本字符串
    3. 根据结果将结果写入文件。

    ---
    - name: Slurps text from file on Windows server
      hosts: win
      gather_facts: false
    
      tasks:    
        - name: Get text
          slurp:
            src: D:\testsearch.ini
          register: norequest
    
        - name: Check for norequest=false in variable
          lineinfile:
            dest: ./norequest.csv
            line: "{{ inventory_hostname }} There is a false value"
            state: present
            create: true
            insertafter: EOF
          when: '"''NoRequest = False'' in norequest.content|b64decode"|lower'
          delegate_to: localhost
    
        - name: Check for norequest=true in variable
          lineinfile:
            dest: ./norequest.csv
            line: "{{ inventory_hostname }} There is a true value."
            state: present
            create: true
            insertafter: EOF
          when: '"''NoRequest = True'' in norequest.content|b64decode"|lower'
          delegate_to: localhost
    

    根据我的结果,playbook似乎从两个测试服务器上的文件中提取文本,并将其全部添加到变量中,然后对其中一个服务器执行条件检查(因为任务本身被委派给localhost),并将结果输出到文件,就好像它们都来自SERVER1(最后一部分似乎是由于委派)。

    PLAY [Slurps text from file on Windows server] *******************************
    
    TASK [Delete previous norequest file] *******************************
    changed: [SERVER1 -> localhost]
    
    TASK [Get text] ***************************************
    ok: [SERVER2]
    ok: [SERVER1]
    
    TASK [Check for norequest=false in variable] ********************************
    changed: [SERVER1 -> localhost]
    
    TASK [Check for norequest=true in variable] *******************************
    changed: [SERVER1 -> localhost]
    
    PLAY RECAP *******************************
    SERVER1  : ok=4    changed=3    unreachable=0    failed=0
    SERVER2  : ok=1    changed=0    unreachable=0    failed=0
    

    以下是运行playbook后文件的内容:

    SERVER1 There is a false value
    SERVER1 There is a true value.
    

    如果剧本按我所希望的那样运作,结果应该是这样的:

    SERVER1 There is a false value
    SERVER2 There is a true value.
    

    我觉得我的问题的一部分(或全部)可能是我从PowerShell的角度来看这个问题;例如,“对于每台服务器,从文件中获取文本,执行条件检查,将输出写入outfile,然后移到下一台服务器。”在Ansible playbook中是否可以这样做?我已经研究了字典来解决这个问题,但是我能找到的唯一好的例子是使用了预先存在的字典或者在运行时使用基本服务器信息填充的字典。

    1 回复  |  直到 7 年前
        1
  •  1
  •   JGK    7 年前

    在我看来 when: 情况不对。匹配现在通过regexp完成。用这个剧本测试:

    ---
    - name: Slurps text from file on Windows server
      hosts:
        - SERVER1
        - SERVER2
      gather_facts: false
    
      tasks:
        - name: Get text
          slurp:
            src: D:\testsearch.ini
          register: norequest
    
        - name: Check for norequest=false in variable
          lineinfile:
            dest: ./norequest.csv
            line: "{{ inventory_hostname }} There is a false value"
            state: present
            create: true
            insertafter: EOF
          when: 'norequest["content"] | b64decode | lower | regex_search("norequest *= *false")'
          delegate_to: localhost
    
        - name: Check for norequest=true in variable
          lineinfile:
            dest: ./norequest.csv
            line: "{{ inventory_hostname }} There is a true  value"
            state: present
            create: true
            insertafter: EOF
          when: 'norequest["content"] | b64decode | lower | regex_search("norequest *= *true")'
          delegate_to: localhost
    

    文件 testsearch.ini

    服务器1

    NoRequest = False
    

    服务器2

    NoRequest = True
    

    执行剧本 ansible-playbook -i hosts play.yml 提供以下输出:

    PLAY [SERVER1,SERVER2] *********************************************************
    
    TASK [Get text] ****************************************************************
    ok: [SERVER1]
    ok: [SERVER2]
    
    TASK [Check for norequest=false in variable] ***********************************
    skipping: [SERVER2]
    ok: [SERVER1 -> localhost]
    
    TASK [Check for norequest=true in variable] ************************************
    skipping: [SERVER1]
    ok: [SERVER2 -> localhost]
    
    PLAY RECAP *********************************************************************
    SERVER1                  : ok=2    changed=0    unreachable=0    failed=0
    SERVER2                  : ok=2    changed=0    unreachable=0    failed=0
    

    内容 norequest.csv 跑步之后

    SERVER1 There is a false value
    SERVER2 There is a true  value
    
    推荐文章