Новое в доступе - я пытаюсь установить 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