Как получить IP-адрес из файла хоста контроллера в Ansible? - PullRequest
1 голос
/ 03 марта 2020

У меня возникают трудности с установкой факта в моей книге воспроизведения Ansible, которая содержит IP-адрес сервера, который указан в файле / etc / hosts на моем контроллере. Я запускаю playbook на моем веб-сервере, которому нужен IP-адрес моего файлового сервера. Я запускаю команду так:

ansible-playbook deploy-webservers.yml -i inventory.ini -l webservers

Мой файл инвентаря выглядит следующим образом:

[fileservers]
prod-fs1.example.com

[webservers]
prod-web1.example.com

[localhost]
127.0.0.1 ansible_connection=local ansible_python_interpreter=/Users/jsmith/.virtualenvs/provision/bin/python

Вот книга игр:

---
hosts: all
gather_facts: yes
become: yes


pre_tasks:
  - name: get file server's IP address
    command: "grep prod-fs1 /etc/hosts | awk '{ print $1 }'"
    register: fs_ip_addr
    delegate_to: localhost

  - debug: var={{ fs_ip_addr }}

Когда я ее запускаю , Я получаю эту ошибку:

TASK [get file server's IP address] ****************************************************************************************
fatal: [prod-web1.example.com -> localhost]: FAILED! => {"changed": true, "cmd": ["grep", "prod-fs1", "/etc/hosts", "|", "awk", "{ print $0 }"], "delta": "0:00:00.010303", "end": "2020-03-03 12:24:36.207656", 
"msg": "non-zero return code", "rc": 2, "start": "2020-03-03 12:24:36.197353", "stderr": "grep: |: No such file or directory\ngrep: awk: No such file or directory\ngrep: { print $0 }: 
No such file or directory", "stderr_lines": ["grep: |: No such file or directory", "grep: awk: No such file or directory", "grep: { print $0 }: No such file or directory"], "stdout": "/etc/hosts:45.79.99.99    prod-fs1.example.com    prod-fs1", "stdout_lines": ["/etc/hosts:45.79.99.99    prod-fs1.example.com    prod-fs1"]}


PLAY RECAP ****************************************************************************************************************
prod-web1.example.com : ok=7    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0;

Похоже, Ansible имеет проблему с анализом команды, когда она достигает символа канала. Есть ли способ обойти эту проблему?

1 Ответ

0 голосов
/ 04 марта 2020

Попробуйте это. Нет необходимости делегировать localhost. lookup всегда работает на контроллере

    - set_fact:
        fs_ip_addr: "{{ (lookup('file', '/etc/hosts').splitlines()|
                         list|
                         select('search', search_host)|
                         list|
                         first).split().0 }}"
      vars:
        search_host: "prod-fs1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...