hostname模块
hostname模块用于管理远程主机上的主机名。
🍤常用参数如下:
name:指明主机名。
[root@ansible ~]# ansible 192.168.1.20 -m hostname -a "name=demo" 192.168.1.20 | CHANGED => { "ansible_facts": { "ansible_domain": "", "ansible_fqdn": "demo", "ansible_hostname": "demo", "ansible_nodename": "demo", "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "name": "demo" } [root@node1 ~]# hostname //在node1主机查看 demo
yum模块
yum模块基于yum机制,对远程主机管理程序包。
🍤常用参数如下:
name:程序包的名称,可以带上版本号。若不指明版本,则默认为最新版本。
state=present|latest|absent:指明对程序包执行的操作,present表示安装程序包,latest表示安装最新版本的程序包,absent表示卸载程序包。
disablerepo:再用yum安装时,临时禁用某个仓库的ID。
enablerepo:再用yum安装时,临时启用某个仓库的ID。
conf_file:yum运行时的配置文件,而不是使用默认的配置文件。
diable_gpg_check=yes|no:其否启用完整性效验功能。
管理端只是发送yum指令到被管理端,被管理端要存在可用的yum仓库才可以安装成功。
1. [root@ansible ~]# ansible web -m yum -a "name=httpd state=present" 2. ......//因为两台服务器都配置了yum所以安装成功 3. [root@ansible ~]# ssh 192.168.1.20 rpm -qa | grep httpd 4. httpd-tools-2.4.6-97.el7.centos.5.x86_64 5. httpd-2.4.6-97.el7.centos.5.x86_64 6. [root@ansible ~]# ssh 192.168.1.30 rpm -qa | grep httpd 7. httpd-tools-2.4.6-97.el7.centos.5.x86_64 8. httpd-2.4.6-97.el7.centos.5.x86_64
service模块
servicee模块为用来管理远程主机上的服务的模块。
🍤常用参数如下:
name:被管理的服务器名称。
state=started|stopped|restarted:动作包含启动、关闭、重启。
enabled=yes|no:表示是否设置该服务开机自动启动。
runlevel:如果设定了enabled开机自启动,则要定义在那些运行目标下自动启动。
[root@ansible ~]# ansible web -m service -a "name=httpd state=started enabled=yes" //启动httpd服务,并设置为开机自启
user模块
user模块用于管理远程主机上的用户账号。
🍤常用参数如下:
name:必选参数,账号名称。
state=present|absent:创建账号或者删除账号,present表示创建,absent表示删除。
system=yes|no:是否为系统账号。
uid:用户UID。
group:用户的基本组。
groups:用户的附加组。
shell:默认使用的shell。
home:用户的家目录。
move_home=yes|no:如果设置的家目录已经存在,是否将已存在的家目录进行移动。
password:用户的密码,建议使用后加密后的字符串。
comment:用户的注释信息。
remove=yes|no:当state=absent时,是否要删除用户的家目录。
🍤创建用户示例如下:
1. [root@ansible ~]# ansible web -m user -a 'name=user1 system=yes uid=501 group=root groups=sshd shell=/sbin/nologin home=/home/user1 password=user1 comment="testuser"' 2. ......//省略部分内容 3. [root@ansible ~]# ssh 192.168.1.20 tail -1 /etc/passwd 4. user1:x:501:0:testuser:/home/user1:/sbin/nologin 5. [root@ansible ~]# ssh 192.168.1.30 tail -1 /etc/passwd 6. user1:x:501:0:testuser:/home/user1:/sbin/nologin
🍤删除用户及家目录示例如下:
1. [root@ansible ~]# ansible web -m user -a "name=user1 remove=yes state=absent" 2. ......//省略部分内容 3. [root@ansible ~]# ssh 192.168.1.20 tail -1 /etc/passwd 4. apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 5. [root@ansible ~]# ssh 192.168.1.30 tail -1 /etc/passwd 6. apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
playbook配置文件
执行配置文件
playbook配置文件使用YAML语法,具有简洁明了、结构清晰等特点。playbook配置文件类似于Shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。YAML语法和其他高级语言类似,其结构通过缩进来展示,通过“-”来代表项,通过冒号“:”来分隔键和值,整个文件以“---”开始并以“...”结束,示例如下。
1. [root@ansible ~]# vim /etc/ansible/hosts //修改hosts文件 2. [web1] 3. 192.168.1.20 4. [web2] 5. 192.168.1.30 6. [root@ansible ~]# vim /etc/ansible/a.yml //创建a.yml文件 7. --- 8. - hosts: web1 //针对web1的操作 9. remote_user: root //远端执行用户身份为root 10. tasks: //任务列表 11. - name: adduser //任务名称 12. user: name=user2 state=present //执行user模块,创建用户 13. tags: //创建tag标签 14. - aaa //tag标签为aaa 15. - name: addgroup //任务名称 16. group: name=root system=yes //执行group模块,创建组 17. tags: //创建tag标签 18. - bbb //tag标签为bbb 19. - hosts: web2 //针对web2的操作 20. remote_user: root //远端执行用户身份为root 21. tasks: //任务列表 22. - name: copy file to web //任务名称 23. copy: src=/etc/passwd dest=/home //执行copy模块,复制文件 24. tags: //创建tag标签 25. - ccc //tag标签为ccc 26. ...
🍤注意:所有的“-”和“:”都有空格,注意缩进和对齐。
playbook文件定义的任务需要通过ansible-playbook命令进行调用并执行,ansible-playbook命令用法如下:
ansible-playbook [option] /PATH/TO/PLAYBOOK.yaml
🍤[option]部分功能如下:
--syntax-check:检测yaml文件的语法。
-C(--check):预测试,不会改变目标主机的任何设置。
--list-hosts:列出yaml文件影响的主机列表。
--list-tasks:列出yaml文件的任务列表。
--list-tags:列出yaml文件中的标签。
-t TAGS(--tags=TAGS):表示只执行指定标签的任务。
--skip-tags=SKIP_TAGS:表示出了指定标签的任务,执行其他任务。
--start-at-task=START_AT:从指定的任务开始往下运行。
🍤示例如下:
1. [root@ansible ~]# ansible-playbook --syntax-check /etc/ansible/a.yml //语法检查 2. 3. playbook: /etc/ansible/a.yml //没有报错提示 4. [root@ansible ~]# ansible-playbook -C /etc/ansible/a.yml //预测试 5. 6. PLAY [web1] *************************************************************************** 7. 8. TASK [Gathering Facts] **************************************************************** 9. ok: [192.168.1.20] 10. 11. TASK [adduser] ************************************************************************ 12. changed: [192.168.1.20] 13. 14. TASK [addgroup] *********************************************************************** 15. ok: [192.168.1.20] 16. 17. PLAY [web2] *************************************************************************** 18. 19. TASK [Gathering Facts] **************************************************************** 20. ok: [192.168.1.30] 21. 22. TASK [copy file to web] *************************************************************** 23. changed: [192.168.1.30] 24. 25. PLAY RECAP **************************************************************************** 26. 192.168.1.20 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 27. 192.168.1.30 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 28. 29. [root@ansible ~]# ansible-playbook --list-hosts /etc/ansible/a.yml //列出主机 30. 31. playbook: /etc/ansible/a.yml 32. 33. play #1 (web1): web1 TAGS: [] 34. pattern: [u'web1'] 35. hosts (1): 36. 192.168.1.20 37. 38. play #2 (web2): web2 TAGS: [] 39. pattern: [u'web2'] 40. hosts (1): 41. 192.168.1.30 42. [root@ansible ~]# ansible-playbook --list-tasks /etc/ansible/a.yml //列出任务列表 43. 44. playbook: /etc/ansible/a.yml 45. 46. play #1 (web1): web1 TAGS: [] 47. tasks: 48. adduser TAGS: [aaa] 49. addgroup TAGS: [bbb] 50. 51. play #2 (web2): web2 TAGS: [] 52. tasks: 53. copy file to web TAGS: [ccc] 54. [root@ansible ~]# ansible-playbook --list-tags /etc/ansible/a.yml //列出标签 55. 56. playbook: /etc/ansible/a.yml 57. 58. play #1 (web1): web1 TAGS: [] 59. TASK TAGS: [aaa, bbb] 60. 61. play #2 (web2): web2 TAGS: [] 62. TASK TAGS: [ccc] 63. [root@ansible ~]# ansible-playbook /etc/ansible/a.yml //执行任务 64. 65. PLAY [web1] *************************************************************************** 66. 67. TASK [Gathering Facts] **************************************************************** 68. ok: [192.168.1.20] 69. 70. TASK [adduser] ************************************************************************ 71. changed: [192.168.1.20] 72. 73. TASK [addgroup] *********************************************************************** 74. ok: [192.168.1.20] 75. 76. PLAY [web2] *************************************************************************** 77. 78. TASK [Gathering Facts] **************************************************************** 79. ok: [192.168.1.30] 80. 81. TASK [copy file to web] *************************************************************** 82. changed: [192.168.1.30] 83. 84. PLAY RECAP **************************************************************************** 85. 192.168.1.20 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 86. 192.168.1.30 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 87. 88. [root@ansible ~]# ssh 192.168.1.20 tail -1 /etc/passwd //确认结果 89. user2:x:1001:1001::/home/user2:/bin/bash 90. [root@ansible ~]# ssh 192.168.1.30 ls -l /home/passwd 91. -rw-r--r--. 1 root root 2226 8月 11 20:15 /home/passwd
触发器
需要触发器才能执行的任务,当之前定义在tasks中的任务执行成功后,若希望在此基础上触发其他的任务,这时就需要定义handlers。
handlers触发器具有以下特点。
- handlers是Ansible提供的条件机制之一。handlers和task很类似,但是它只在被task通知的时候才会触发执行。
- handlers只会在所有任务执行完后执行。而且即使被通知了多次,它也只会执行一次。handlers按照定义的顺序依次执行。
🍤示例如下:
1. [root@ansible ~]# ssh 192.168.1.20 netstat -anpt | grep 80 2. tcp6 0 0 :::80 :::* LISTEN 6987/httpd 3. [root@ansible ~]# vim /etc/ansible/httpd.yml 4. --- 5. - hosts: web1 6. remote_user: root 7. tasks: 8. - name: aaa 9. command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf 10. notify: //配置触发条件 11. - yy //触发器任务名称 12. handlers: //配置触发器 13. - name: yy //执行触发器名称 14. service: name=httpd state=restarted //触发任务重启httpd服务 15. ... 16. 17. [root@ansible ~]# ansible-playbook /etc/ansible/httpd.yml 18. 19. PLAY [web1] *************************************************************************** 20. 21. TASK [Gathering Facts] **************************************************************** 22. ok: [192.168.1.20] 23. ......//省略部分内容 24. [root@ansible ~]# ssh 192.168.1.20 netstat -anpt | grep 8080 //远端主机已经运行8080端口 25. tcp6 0 0 :::8080 :::* LISTEN 48440/httpd
角色
多种不同的tasks的文件集中存储在某个目录下,则该目录就是角色。/etc/ansible/roles目录存放着角色,目录下有多个子目录,每个子目录对应一个角色,每个角色也有自己的目录角色。
/etc/ansible/roles/为角色集合,该目录下有自定义的各个子目录:
mariadb:mysql角色。
Apache:httpd角色。
nginx:Nginx角色。
每个角色的定义,以特定的层级目录结构进行组织。以Mariadb为例:
files:存放由copy或script等模块调用的文件。
templates:存放template模块查找所需要的模板文件的目录,如mysql配置文件等模板。
tasks:任务存放的目录。
handlers:存放相关触发路径的目录。
vars:变量存放的目录。
meta:用于存放此角色元数据。
default:默认变量存放的目录,文件中定义了此角色使用的默认变量。
下面通过一个实例配置数据库角色,要求被管理主机上自动安装Mariadb,安装完成后上传提前准备好的配置文件至远端主机,重启服务,然后新建testdb数据库,并允许test用户对其拥有所有权限。
- 被管理端配置yum
之前已经配置过了网络源。
- 配置数据库角色。
1. [root@ansible ~]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers} 2. mkdir: 已创建目录 "/etc/ansible/roles/mariadb" 3. mkdir: 已创建目录 "/etc/ansible/roles/mariadb/files" 4. mkdir: 已创建目录 "/etc/ansible/roles/mariadb/tasks" 5. mkdir: 已创建目录 "/etc/ansible/roles/mariadb/handlers" 6. [root@ansible ~]# cd /etc/ansible/roles/mariadb/tasks/ 7. [root@ansible tasks]# vim main.yml 8. --- 9. - name: install mariadb 10. yum: name=mariadb-server state=present 11. - name: move config file 12. shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak" 13. - name: provide a new config file 14. copy: src=my.cnf dest=/etc/my.cnf 15. - name: reload mariadb 16. shell: systemctl restart mariadb 17. - name: create database testdb 18. shell: mysql -u root -e "create database testdb;grant all on testdb.* to 'test'@''192.168.1.%' identified by 'test123';flush privileges;" 19. notify: 20. - restart mariadb 21. ... 22. [root@ansible tasks]# cd ../handlers/ 23. [root@ansible handlers]# vim main.yml 24. --- 25. - name: restart mariadb 26. service: name=mariadb state=restarted 27. ... 28. [root@ansible handlers]# cd ../files/ 29. [root@ansible files]# cp /etc/my.cnf . 30. [root@ansible files]# cd /etc/ansible 31. [root@ansible ansible]# vim mariadb.yml 32. --- 33. - hosts: web1 34. remote_user: root 35. roles: 36. - mariadb 37. ... 38. [root@ansible ansible]# ansible-playbook mariadb.yml
- 查看1.20主机
在1.20主机上查看是否已经创建了testdb数据库,并测试以test用户登录。