[root@node1 ~]# vi hello.yml
[root@node1 ~]# cat hello.yml
---
- hosts: node2,node3
tasks:
- name: "helloworld"
shell: echo "Hello World" `date` by `hostname` > /tmp/hello.log
playbook的说明:
[root@node1 ~]# ansible-playbook hello.yml
PLAY [node2,node3] **************************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************
ok: [node3]
ok: [node2]
TASK [helloworld] ***************************************************************************************************************************************************************************
changed: [node3]
changed: [node2]
PLAY RECAP **********************************************************************************************************************************************************************************
node2 : ok=2 changed=1 unreachable=0 failed=0
node3 : ok=2 changed=1 unreachable=0 failed=0
对照执行的结果,基本上已经无需说明。 changed有2个,unreachable和失败的都没有。
[root@node2 ~]# cat /tmp/hello.log
Hello World Sun Nov 12 07:50:48 EST 2017 by node2
[root@node2 ~]#
[root@node3 ~]# cat /tmp/hello.log
Hello World Sun Nov 12 07:50:48 EST 2017 by node3
[root@node3 ~]#
什么会有setup这个task呢,那是因为default的情况下,facts是会被收集的的,我们可以通过设定参数gather_facts让其不被收集。
[root@node1 ~]# vi hello.yml
[root@node1 ~]# cat hello.yml
---
- hosts: node2,node3
gather_facts: false
tasks:
- name: "helloworld"
shell: echo "Hello World" `date` by `hostname` > /tmp/hello.log
[root@node1 ~]# ansible-playbook hello.yml
PLAY [node2,node3] **************************************************************************************************************************************************************************
TASK [helloworld] ***************************************************************************************************************************************************************************
changed: [node3]
changed: [node2]
PLAY RECAP **********************************************************************************************************************************************************************************
node2 : ok=1 changed=1 unreachable=0 failed=0
node3 : ok=1 changed=1 unreachable=0 failed=0
[root@node1 ~]#
Ansbile还内嵌了七个很有用的变量,使用得当也会带来很大的便利。
ansible的playbook中的变量引用使用{{ }}。 hostvars变量 groups变量 group_names变量 inventory_hostname变量 inventory_hostname_short inventory_dir inventory_file
在vars后设定变量message,并将此message内容输出到log中
gather_facts参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用到setup获取的信息时用到;
[root@node1 ~]# vi hello.yml
[root@node1 ~]# cat hello.yml
---
- hosts: node2,node3
vars:
- message: "hello,world"
gather_facts: false
tasks:
- name: "helloworld"
shell: echo {{message}} `date` by `hostname` > /tmp/hello.log
[root@node1 ~]# ansible-playbook hello.yml
PLAY [node2,node3] **************************************************************************************************************************************************************************
TASK [helloworld] ***************************************************************************************************************************************************************************
changed: [node3]
changed: [node2]
PLAY RECAP **********************************************************************************************************************************************************************************
node2 : ok=1 changed=1 unreachable=0 failed=0
node3 : ok=1 changed=1 unreachable=0 failed=0
[root@node1 ~]#
[root@node2 ~]# cat /tmp/hello.log
hello,world Sun Nov 12 07:51:48 EST 2017 by node2
[root@node2 ~]#
[root@node3 ~]# cat /tmp/hello.log
hello,world Sun Nov 12 07:51:48 EST 2017 by node3
[root@node3 ~]#
[root@node1 ~]# vi java.yml
[root@node1 ~]# cat java.yml
---
- hosts: node2,node3
gather_facts: false
tasks:
- name: "java-test"
shell: echo ${JAVA_HOME} >/tmp/hello.log
[root@node1 ~]# ansible-playbook java.yml
PLAY [node2,node3] **************************************************************************************************************************************************************************
TASK [java-test] ****************************************************************************************************************************************************************************
changed: [node3]
changed: [node2]
PLAY RECAP **********************************************************************************************************************************************************************************
node2 : ok=1 changed=1 unreachable=0 failed=0
node3 : ok=1 changed=1 unreachable=0 failed=0
[root@node1 ~]#
[root@node2 ~]# cat /tmp/hello.log
/opt/jdk1.8.0_112
[root@node2 ~]#
[root@node3 ~]# cat /tmp/hello.log
/opt/jdk1.8.0_112
[root@node3 ~]#
Ansible中有众多的模块,可以写playbook,同时里面也可以写条件判断和循环,这样基本上脚本能做的事情ansible大体都可以作了。条件判断使用when,循环使用with_items,接下来看一下如何使用的简单实例。
需要开启facts变量功能, gather_facts: no 或者是false是关闭,gather_facts:yes 或者是true都是开启。
[root@node1 ~]# vi when.yml
[root@node1 ~]# cat when.yml
---
- hosts: node2,node3
gather_facts: true
tasks:
- name: "redhat-test"
shell: echo "RedHat" `date` by `hostname` >> /tmp/hello.log
when: ansible_os_family == "RedHat"
- name: "other linux"
shell: echo "Not RedHat" `date` by `hostname` >> /tmp/hello.log
when: ansible_os_family != "RedHat"
[root@node1 ~]#
[root@node1 ~]# ansible-playbook when.yml
PLAY [node2,node3] **************************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************
ok: [node2]
ok: [node3]
TASK [redhat-test] **************************************************************************************************************************************************************************
changed: [node3]
changed: [node2]
TASK [other linux] **************************************************************************************************************************************************************************
skipping: [node2]
skipping: [node3]
PLAY RECAP **********************************************************************************************************************************************************************************
node2 : ok=2 changed=1 unreachable=0 failed=0
node3 : ok=2 changed=1 unreachable=0 failed=0
[root@node1 ~]#
[root@node2 ~]# cat /tmp/hello.log
/opt/jdk1.8.0_112
RedHat Sun Nov 12 08:44:00 EST 2017 by node2
[root@node2 ~]#
[root@node3 ~]# cat /tmp/hello.log
/opt/jdk1.8.0_112
RedHat Sun Nov 12 08:44:00 EST 2017 by node3
[root@node3 ~]#
[root@node1 ~]# vi with_items.yml
[root@node1 ~]# cat with_items.yml
- hosts: node2,node3
gather_facts: true
tasks:
- name: "循环测试"
shell: echo {{item}} `date` by `hostname` >> /tmp/hello.log
with_items:
- message item1
- message item2
- message item3
- message item4
- message item5
[root@node1 ~]# ansible-playbook with_items.yml
PLAY [node2,node3] ********************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [node2]
ok: [node3]
TASK [循环测试] ***************************************************************************************************************
changed: [node2] => (item=message item1)
changed: [node3] => (item=message item1)
changed: [node3] => (item=message item2)
changed: [node2] => (item=message item2)
changed: [node3] => (item=message item3)
changed: [node2] => (item=message item3)
changed: [node2] => (item=message item4)
changed: [node3] => (item=message item4)
changed: [node2] => (item=message item5)
changed: [node3] => (item=message item5)
PLAY RECAP ****************************************************************************************************************
node2 : ok=2 changed=1 unreachable=0 failed=0
node3 : ok=2 changed=1 unreachable=0 failed=0
[root@node1 ~]#
[root@node2 ~]# cat /tmp/hello.log
message item1 Sun Nov 12 08:54:50 EST 2017 by node2
message item2 Sun Nov 12 08:54:51 EST 2017 by node2
message item3 Sun Nov 12 08:54:51 EST 2017 by node2
message item4 Sun Nov 12 08:54:51 EST 2017 by node2
message item5 Sun Nov 12 08:54:52 EST 2017 by node2
[root@node2 ~]#
[root@node3 ~]# cat /tmp/hello.log
message item1 Sun Nov 12 08:54:50 EST 2017 by node3
message item2 Sun Nov 12 08:54:51 EST 2017 by node3
message item3 Sun Nov 12 08:54:51 EST 2017 by node3
message item4 Sun Nov 12 08:54:52 EST 2017 by node3
message item5 Sun Nov 12 08:54:52 EST 2017 by node3
[root@node3 ~]#
yum模块: 目的:在指定节点上安装 apache 服务 命令:ansible all -m yum -a “state=present name=httpd” state=latest=>>安装最新版本 service模块: 目的:启动指定节点上的 httpd 服务,并让其开机自启动 命令:ansible 10.1.1.113 -m service -a ‘name=httpd state=restarted enabled=yes’
[root@node1 ~]# vi apache.yml
[root@node1 ~]# cat apache.yml
---
- hosts: node2
remote_user: root
gather_facts: true
tasks:
- name: "install apache on CentOS"
yum: name=httpd state=present
when: ansible_os_family =="RedHat"
- name: "install apache on Debian"
yum: name=apache2 state=present
when: ansible_os_family =="Debian"
- name: "启动Apache,并设置开机启动"
service: name=httpd state=started enabled=yes
[root@node1 ~]# ansible-playbook apache.yml
PLAY [node2] ********************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************
ok: [node2]
TASK [install apache on CentOS] *************************************************************************************************
ok: [node2]
TASK [install apache on Debian] *************************************************************************************************
skipping: [node2]
TASK [启动Apache,并设置开机启动] *********************************************************************************************************
changed: [node2]
PLAY RECAP **********************************************************************************************************************
node2 : ok=3 changed=1 unreachable=0 failed=0
[root@node1 ~]#
[root@node2 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2017-11-13 08:40:59 EST; 1s ago
Docs: man:httpd(8)
man:apachectl(8)
Process: 2908 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
Main PID: 2913 (httpd)
Status: "Processing requests..."
CGroup: /system.slice/httpd.service
├─2913 /usr/sbin/httpd -DFOREGROUND
├─2914 /usr/sbin/httpd -DFOREGROUND
├─2915 /usr/sbin/httpd -DFOREGROUND
├─2916 /usr/sbin/httpd -DFOREGROUND
├─2917 /usr/sbin/httpd -DFOREGROUND
└─2918 /usr/sbin/httpd -DFOREGROUND
Nov 13 08:40:59 node2 systemd[1]: Starting The Apache HTTP Server...
Nov 13 08:40:59 node2 httpd[2913]: AH00558: httpd: Could not reliably determine the server's fully qualified domain nam...message
Nov 13 08:40:59 node2 systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@node2 ~]#