我正在研究一个可靠的手册,以获取服务器的当前主机名,然后将其设置为configuration文件。 我无法弄清楚如何使用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=????
一般来说,要查看variables内部的内容,可以使用debug模块。
- debug: var: result
这应该显示一个对象及其属性,其中包括stdout 。 这是前一个命令的完整结果。 所以要使用第一个任务的输出,你可以使用result.stdout 。
要使用任何variables,您可以使用Jinja2expression式: {{ 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 }}
您应该在命令行中传递variables 。
首先,注册variables
--- - 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的variables中,第二个存储在variablesv中。whoami的结果是单个string,作为variablename.stdout提供给模板。 jpprog.sh的结果是一个以string表示的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男士网站 。