Ansible部署
构建Ansible清单
定义清单
清单定义Ansible将要管理的一批主机。这些主机也可以分配到组中,以进行集中管理。组可以包含子组,主机也可以是多个组的成员。清单还可以设置应用到它所定义的主机和组的变量。
可以通过两种方式定义主机清单。静态主机清单可以通过文本文件定义。动态主机清单可以根据需要使用外部信息提供程序通过脚本或其他程序来生成。
静态清单文件是指定Ansible目标受管主机的文本文件。可以使用多种不同的格式编写此文件,包括INI样式或YAML。
在最简单的形式中。INI样式的静态清单文件是受管主机的主机名或IP地址的列表,每行一个
green.example.com blue.example.com 192.168.100.1 192.168.100.10
但通常而言,可以将受管主机组织为主机组。通过主机组,可以更加有效的对一系列系统运行Ansible。这时,每一部分的开头为以中括号括起来的主机组名称。其后为该组中每一受管主机的主机名或IP地址,每行一个。
[webservers] alpha.example.org beta.example.org 192.168.1.100 192.168.1.110 www[001:006].example.com [dbservers] db01.intranet.mydomain.net db02.intranet.mydomain.net 10.25.1.56 10.25.1.57 db-[99:101]-node.example.com
自定义清单文件
主控:192.168.248.130 node
被控:192.168.248.131 node1
被控:192.168.248.132 node2
#配置主控/etc/hosts/映射被控节点 [root@node ~]# vim /etc/hosts [root@node ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.248.131 node1 [root@node ~]# ping node1 PING node1 (192.168.248.131) 56(84) bytes of data. 64 bytes from node1 (192.168.248.131): icmp_seq=1 ttl=64 time=0.962 ms ......................
如果清单中含有名称相同的主机和主机组,ansible 命令将显示警告并以主机作为其目标。主机组则被忽略。
应对这种情况的方法有多种,其中最简单的是确保主机组不使用与清单中主机相同的名称。
/etc/ansible/hosts文件被视为系统的默认静态清单文件。不过,通常的做法是不使用该文件,而是在Ansible配置文件中为清单文件定义一个不同的位置。
[root@node ~]# vim /etc/ansible/ansible.cfg [defaults] # some basic default values... inventory = ./inventory #取消注释,重新定义清单文件 #library = /usr/share/my_modules/ #创建清单文件 [root@node ~]# vim /etc/ansible/inventory 192.168.248.132 [webservers] node1 #列出默认清单文件中的所有受管主机 [root@node ~]# ansible all --list-hosts hosts (2): 192.168.248.132 node1 #列出不属于任何组的受管主机 [root@node ~]# ansible ungrouped --list-hosts hosts (1): 192.168.248.132 #列出属于某组的受管主机 [root@node ~]# ansible webservers --list-hosts hosts (1): node1
ssh免密钥登录设置(只在控制端使用)
#生成密钥 [root@node ~]# ssh-keygen -t rsa #管理机与被管理机做秘钥认证 [root@node ~]# ssh-copy-id root@192.168.248.131 [root@node ~]# ssh-copy-id root@192.168.248.131 [root@node ~]# ansible 192.168.248.132 -m ping 192.168.248.132 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" } [root@node ~]# ansible node1 -m ping node1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" }
Ansible配置文件
可以通过修改 Ansible 配置文件中的设置来自定义 Ansible安装的行为。Ansible从控制节点上多个可能的位置之一选择其配置文件。
使用/etc/ansible/ansible.cfg
ansible软件包提供一个基本的配置文件,它位于/etc/ansible/ansible.cfg。如果找不到其他配置文件,则使用此文件。
使用~/.ansible.cfg
Ansible在用户的家目录中查找.ansible.cfg文件。如果存在此配置文件并且当前工作目录中也没有ansible.cfg文件,则使用此配置取代/etc/ansible/ansible.cfg。
使用./ansible.cfg
如果执行ansible命令的目录中存在ansible.cfg文件,则使用它,而不使用全局文件或用户的个人文件。这样,管理员可以创建一种目录结构,将不同的环境或项目存储在单独的目录中,并且每个目录包含为独特的一组设置而定制的配置文件。
推荐的做法是在需要运行Ansible命令的目录中创建ansible.cfg文件。此目录中也将包含任何供Ansible项目使用的文件,如清单和playbook。这是用于Ansible配置文件的最常用位置。实践中不常使用~/.ansible.cfg或/etc/ansible/ansible.cfg文件
使用ANSIBLE_CONFIG环境变量
我们可以通过将不同的配置文件放在不同的目录中,然后从适当的目录执行Ansible命令,以此利用配置文件。但是,随着配置文件数量的增加,这种方法存在局限性并且难以管理。有一个更加灵活的选项,即通过ANSIBLE_CONFIG环境变量定义配置文件的位置。定义了此变量时,Ansible将使用变量所指定的配置文件,而不用上面提到的任何配置文件。
配置文件的优先级
ANSIBLE_CONFIG环境变量指定的任何文件将覆盖所有其他配置文件。如果没有设置该变量,则接下来检查运行ansible命令的目录中是否有ansible.cfg文件。如果不存在该文件,则检查用户的家目录是否有.ansible.cfg文件。只有在找不到其他配置文件时,才使用全局/etc/ansible/ansible.cfg文件。如果/etc/ansible/ansible.cfg配置文件不存在,Ansible包含它使用的默认值。
使用ansible --version查看Ansible版本以及正在使用的配置文件
[root@node ~]# ansible --version ansible 2.9.16 config file = /etc/ansible/ansible.cfg configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.6/site-packages/ansible executable location = /usr/bin/ansible python version = 3.6.8 (default, Dec 5 2019, 15:45:45) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)] [root@node ~]# cp /etc/ansible/ansible.cfg ./.ansible.cfg root@node ~]# ansible --version ansible 2.9.16 config file = /root/.ansible.cfg configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.6/site-packages/ansible executable location = /usr/bin/ansible python version = 3.6.8 (default, Dec 5 2019, 15:45:45) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
ansible默认配置值
[defaults] # some basic default values... inventory = /etc/ansible/inventory ;定义清单 #library = /usr/share/my_modules/ ;自定义lib库存放目录 #module_utils = /usr/share/my_module_utils/ ;默认搜寻模块的位置 #remote_tmp = ~/.ansible/tmp ;远程执行临时文件 #local_tmp = ~/.ansible/tmp #plugin_filters_cfg = /etc/ansible/plugin_filters.yml #forks = 5 ;默认开启并发数 #poll_interval = 15 ;默认轮询时间间隔 #sudo_user = root ;默认sudo用户 #ask_sudo_pass = True ;是否需要sudo密码 #ask_pass = True ; 是否需要密码 #transport = smart ;通信机制 #remote_port = 22 ;远程SSH端口 #module_lang = C ;模块和系统之间通信的语言 #module_set_locale = False [privilege_escalation] # become=True # 是否sudo # become_method=sudo # sudo方式 # become_user=root # sudo后变为root用户 # become_ask_pass=False # sudo后是否验证密码
运行临时命令
使用临时命令可以快速执行单个Ansible任务,不需要将它保存下来供以后再次运行。它们是简单的在线操作,无需编写playbook即可运行。
临时命令对快速测试和更改很有用。例如,可以使用临时命令确保一组服务器上的/etc/hosts文件中存在某一特定的行。可以使用另一个临时命令在许多不同的计算机上高效的重启服务,或者确保特定的软件包为最新版本。
临时命令对于通过Ansible快速执行简单的任务非常有用。它们确实也存在局限,而且总体而言,要使用Ansible Playbook来充分发挥Ansible的作用。但在许多情形中,临时命令正是快速执行简单任务所需要的工具。
Ansible运行临时命令的语法如下:
ansible host-pattern -m module [-a 'module arguments'] [-i inventory] [root@node ~]# ansible all -m shell -a 'echo "hello world" > /root/test' 192.168.248.132 | CHANGED | rc=0 >> node1 | CHANGED | rc=0 >> [root@node ~]# ansible all -a 'cat /root/test' 192.168.248.132 | CHANGED | rc=0 >> hello world node1 | CHANGED | rc=0 >> hello world
ansible-doc -l命令可以列出系统上安装的所有模块。可以使用ansible-doc来按照名称查看特定模块的帮助文档,再查找关于模块将取什么参数作为选项的信息。例如以下命令显示USER模块的帮助文档,在帮助文档里面输入q
命令表示退出:
[root@node ~]# ansible-doc user > USER (/usr/lib/python3.6/site-packages/ansible/modules/system/user.py) Manage user accounts and user attributes. For Windows targets, use the [win_user] module instead. * This module is maintained by The Ansible Core Team OPTIONS (= is mandatory): - append ............................................................................