如何使用bash将shell模块命令转换为自己的模块?

时间:2019-07-29 10:57:44

标签: bash shell module ansible

这是我的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

2 个答案:

答案 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