这是我的yml文件:
- hosts: webservers
vars:
www_port: 80
become: yes
tasks:
- name: install lsof if it's redhat
yum:
name: lsof
state: latest
when: ansible_distribution == 'CentOS' or ansible_distribution == 'Red Hat Enterprise Linux'
- name: install lsof if it's debian
apt:
name: lsof
state: latest
when: ansible_distribution == 'Ubuntu' or ansible_distribution == 'Debian'
- name: Finding out what web server it uses
shell: "lsof -i :{{ www_port }} | grep LISTEN | cut -d ' ' -f 1"
register: result
- name: output the result of what web server it uses
debug: msg="{{ result.stdout_lines|first }}"
- name: list all vhosts if it uses httpd
shell: cd /etc/httpd/sites-enabled; ls | while read file; do awk '/^ServerName/ {f=1} f {for(i=1;i<=NF;i++)$
register: rezult
when: result.stdout_lines|first == "httpd"
- name: output vhosts rezult if it uses httpd
debug: msg="{{ rezult.stdout_lines }}"
when: result.stdout_lines|first == "httpd"
- name: list all vhosts if it uses nginx
shell: cd /etc/nginx/sites-enabled; ls | while read file; do awk '/^server_name/ {f=1} f {for(i=1;i<=NF;i++$
register: recult
when: result.stdout_lines|first == "nginx"
- name: output vhosts recult (results) if it uses nginx
debug: msg="{{ recult.stdout_lines }}"
when: result.stdout_lines|first == "nginx"
由于我不了解python,因此我想使用bash脚本将这些“ shell:”模块命令转换为我自己的模块。本质上,此剧本输出主机使用的Web服务器的名称,并在Web服务器配置文件中输出所有虚拟主机。我想将这些shell:模块命令组合到一个可以完成所有这些工作的模块中。
ansible.cfg文件指出,我自己的模块的库位于/ usr / share / my_modules中,因此我创建了该目录并创建了vhosts.bash脚本,该脚本基本上是yml文件中的第二个shell命令。我用ony“ vhosts:”代替了这一行(“ shell:....”),但是那行不通。 这是/ usr / share / my_modules
中的vhosts.bash文件。#!/bin/bash
cd /etc/httpd/sites-enabled;
ls | while read file;
do awk '/^ServerName/ {f=1} f {for(i=1;i<=NF;i++) if ($i~/\./) print $i; else if($i!="ServerName") exit}' $file;
done;
当我运行剧本时,我得到:
- name: list all vhosts if it uses httpd
^ here
但与名称无关,这是yml中的行:
- name: list all vhosts if it uses httpd
vhosts:
register: rezult
我不知道我是否完全错过了重点,但这就是这个家伙在视频中的做法:https://www.youtube.com/watch?time_continue=1&v=aY7lmtW8ROM
答案 0 :(得分:0)
不确定缩进是否正确,名称后的行应像这样:
- name: list all vhosts if it uses httpd
vhosts:
答案 1 :(得分:0)
看起来您正在选择默认的模块路径:
(default) = ['/home/ansible/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
您将需要移动模块,更改全局ansible.cfg,或创建本地ansible.cfg。如果该模块是特定于此剧本的,则您还可以考虑将其放置在剧本目录中名为library
的文件夹中。
您将遇到的第二个问题是bash模块需要以Ansible可读的方式输出成功/失败状态。例如,您将需要具有类似于以下内容的输出:
if [ $? == 0 ]; then
printf '{"changed": true, "rc": 0}'
else
printf '{"failed": true, "msg": "Something went wrong", "rc": 1}'
fi