我正在编写一个ansible剧本,以获取服务器的当前主机名,然后将其设置为一个配置文件。我想不出如何使用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=????
发布于 2016-03-02 03:16:27
通常,要查看变量中的内容,可以使用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 }}
发布于 2016-03-01 21:51:08
你应该在命令行中传递变量。
首先,注册变量
---
- 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
资料来源:网站.
发布于 2018-09-27 20:23:56
- name: Set hostname on conf file
command: sed -i s/whatComesAfterHostname=/{{ ansible_hostname }}/g /etc/teste/linux/zabbix_agentd.conf
为我工作过。
https://serverfault.com/questions/760832
复制相似问题