Назад | Перейти на главную страницу

Как я могу назначить доступную переменную, доступную для разных задач?

Новое в доступе - я пытаюсь установить PS1 переменная в /etc/bash.bashrc в зависимости от состояния IP-адреса хоста. Но у меня проблемы с ps1 переменная доступна через тасск. Я не знаю, проблема ли это в области видимости (насколько я могу судить по эта ссылка) или если у меня действительно должны быть два отдельных плейбука, которые в основном делают одно и то же (один для хостов LAN, один для хостов WIFI). Когда я запускаю эту пьесу, я получаю:

The task includes an option with an undefined variable. The error: 'dict object' has no attribute 'stdout'\n\n

Есть ли способ определить ps1 переменная, чтобы я мог назначить ее внутри задачи и сделать ее доступной для других задач?

---
- hosts: all
  tasks:
    - name: generate LAN host bash prompt
      when: ansible_default_ipv4.address is match("192.168.16")
      connection: local
      shell : /usr/local/bin/psgen -l
      register: ps1
    - debug: var=ps1.stdout

    - name: generate WIFI host bash prompt
      when: ansible_default_ipv4.address is match("172.10.1")
      connection: local
      shell : /usr/local/bin/psgen -w
      register: ps1

    - name: write PS1 to remote /etc/bash.bashrc
      lineinfile:
        dest: /etc/bash.bashrc
        line: "{{ ps1.stdout }}"
        regexp: "PS1="
        insertafter: EOF

@Zoredache правильный.

Из: http://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#registered-variables

Если задача не выполняется или пропускается, переменная по-прежнему регистрируется с ошибкой или пропущенным статусом, единственный способ избежать регистрации переменной - использовать теги.

Это должно работать:

- name: lan
  set_fact:
    psgen_args: -l
  when: ansible_default_ipv4.address is match("192.168.16")

- name: wlan
  set_fact:
    psgen_args: -w
  when: ansible_default_ipv4.address is match("172.10.1")

- name: set ps1
  shell: /usr/local/bin/psgen {{ psgen_args }}
  register: ps1

- name: write PS1 to remote /etc/bash.bashrc
  lineinfile:
    dest: /etc/bash.bashrc
    line: "{{ ps1.stdout }}"
    regexp: "PS1="
    insertafter: EOF

Если бы я собирался это сделать, я бы не стал добавлять задачи. Вместо этого я бы удалил один, превратив вашу задачу в цикл. Когда вы перебираете что-то, все результаты будут сохранены в списке. Затем вы можете использовать различные выражения jinja, чтобы извлечь успешный результат из списка.

---
- hosts: all
  tasks:
  - name: generate host bash prompt
    when: ansible_default_ipv4.address is match(item.net_match)
    connection: local
    shell : "{{item.shell}}"
    register: ps1
    loop:
    - name: LAN
      shell: /usr/local/bin/psgen -l
      net_match: 192.168.16
    - name: WAN
      shell: /usr/local/bin/psgen -w
      net_match: 172.10.1

  - debug:
      msg: "ps1"
  - debug:
      msg: "{{ (ps1.results | selectattr('rc', 'defined') | list)[0].stdout }}"

  - name: write PS1 to remote /etc/bash.bashrc
    lineinfile:
      dest: /etc/bash.bashrc
      line: "{{ (ps1.results | selectattr('rc', 'defined') | list)[0].stdout }}"
      regexp: "PS1="
      insertafter: EOF