我正在编写一个 ansible playbook 来获取服务器的当前主机名,然后将其设置到配置文件中。我不知道如何使用 lineinfile 模块推送 shell 输出。
- name: Get hostname
shell: echo $HOSTNAME
register: result
- name: Set hostname on conf file
lineinfile: dest=/etc/teste/linux/zabbix_agentd.conf regexp="^Hostname=.*" insertafter="^# Hostname=" line=Hostname=????
答案1
一般来说,要查看变量内部的内容,可以使用模块debug
。
- debug:
var: result
这应该会向您显示一个对象及其属性,其中包括stdout
。这是上一个命令的完整结果。因此,要使用第一个任务的输出,您可以使用result.stdout
。
要使用任何变量,您都可以使用 Jinja2 表达式:{{ whatever }}
。因此您的任务可能如下所示:
- name: Set hostname on conf file
lineinfile:
dest: /etc/teste/linux/zabbix_agentd.conf
regexp: ^Hostname=.*
insertafter: ^# Hostname=
line: Hostname={{ result.stdout }}
理论就讲这么多,但真正的答案来了。不要那样做。当然 Ansible 已经知道主机名了。
您的清单中定义的主机名将是{{ inventory_hostname }}
。服务器报告的主机名是{{ ansible_hostname }}
。此外还有{{ ansible_fqdn }}
。因此,只需使用其中任何一个,而不必运行其他任务:
- name: Set hostname on conf file
lineinfile:
dest: /etc/teste/linux/zabbix_agentd.conf
regexp: ^Hostname=.*
insertafter: ^# Hostname=
line: Hostname={{ ansible_hostname }}
答案2
你应该在命令行中传递变量。
首先,注册变量
---
- hosts: 127.0.0.1
connection: local
vars:
- person: John Snow
- filename: v1.j2
vars_files:
- vars.yml
tasks:
- name: Who I am?
action: command /usr/bin/whoami
register: myname
- name: Run jpprog.sh
action: command ./jpprog.sh
register: v
- name: Populate template
action: template src={{filename}} dest=/tmp/out
此剧本运行两个命令:第一个命令将其输出存储在名为 myname 的变量中,第二个命令存储在变量 v 中。whoami 的结果是一个字符串,以 variablename.stdout 的形式提供给模板。jpprog.sh 的结果是一个以字符串表示的 JSON 对象:
{
"number": 18,
"name": "john"
}
模板如下:
-> I am {{ myname.stdout }}
{% set t = v.stdout|from_json %}
JSON struct T: {{ t }}
name = {{ t.name }}
number = {{ t['number'] }}
输出为:
-> I am jpm
JSON struct T: {u'number': 18, u'name': u'john'}
name = john
number = 18
来源:Jan-Piet 男士网站。
答案3
- name: Set hostname on conf file
command: sed -i s/whatComesAfterHostname=/{{ ansible_hostname }}/g /etc/teste/linux/zabbix_agentd.conf
对我有用。