在Ansible中,如何在一个任务中导出环境变量,以便其他任务可以使用它?

时间:2016-08-19 14:12:27

标签: ansible ansible-playbook

说我有以下文件

foo.txt
Hello world=1
Hello world=2
...
Hello world=N

我想使用Ansible插入另一个Hello world行,就像这样

foo.txt
Hello world=1
Hello world=2
...
Hello world=N
Hello world=N+1

IOW,我不知道家里有很多Hello world行,我需要通过脚本找出,并获得N的值。

在Ansible中,说我有以下shell任务

- name: Find the last Hello world in foo.txt, and get the value of N
  shell: >
    # Get last Hello world line in foo.txt. I want to export this as an
    # environment variable
    LAST_HW_LINE=`awk '/Hello world/ {aline=$0} END{print aline}' "foo.txt"`
    # Get left side of equation
    IFS='=' read -ra LS <<< "$LAST_HW_LINE"
    # Get the value of N
    NUM=${LS##*\.}
    # Increment by 1. I want to export this as an environment variable
    NUM=$((NUM+1))

我希望能够随后做到这一点

- name: Add the next Hello world line
  lineinfile:
    dest: foo.txt
    insertafter: "{{ lookup('env', 'LAST_HW_LINE') }}"
    line: "Hello world={{ lookup('env', 'NUM') }}"

也许有比使用环境变量更好的方法吗?

1 个答案:

答案 0 :(得分:2)

Register Variables

- shell: /usr/bin/foo
  register: foo_result

Registering stdout as ansible variables

- debug: msg="{{ hello.stdout }}"    
- debug: msg="{{ hello.stderr }}"

Including task with variables

tasks:
  - include: wordpress.yml wp_user=timmy

Including role with variables

- hosts: webservers
  roles:
    - common
    - { role: foo_app_instance, dir: '/opt/a',  app_port: 5000 }

对于你的情况:

- name: so question 39041208
  hosts: '{{ target | default("all") }}'
  tasks:
  - name: Find the last Hello world in foo.txt, and get the value of N
#    shell: awk '/Hello world/ {aline=$0} END{print aline}' "/home/ak/ansible/stackoverflow/q39041208.txt"
    shell: awk '/Hello world/ {aline=$0} END{print NR}' "/home/ak/ansible/stackoverflow/q39041208.txt"
    register: last_line
    ignore_errors: true
  - name: debug
    debug: msg="last line {{ last_line.stdout }}"
  - name: debug next number
    debug: msg="next num {{ last_line.stdout | int + 1 }}"
  - name: Add the next Hello world line
    lineinfile:
      dest: /home/ak/ansible/stackoverflow/q39041208.txt
      insertafter: "{{ last_line.stdout }}"
      line: "Hello world={{ last_line.stdout | int + 1 }}"