基于中国本土的选项,请将以下内容翻译成中文:Ansible的基础知识
在我们上次构建好了环境之后,我再次从官方文档中总结了一些关于Ansible的内容。
The prerequisite
-
- 2018/02/28時点の情報つまりAnsible v2.4
-
- 以降のリンクは最新版(latest)への参照であり、また正式なレビューも受けていないため、本記事と内容が異なる場合は参照先が真
- deprecatedなものは記載しない
命令参考指南
首先从常用的(可能的)命令开始。
Ansible(安神)
对主机执行单个任务(playbook)的命令。
单次执行「远程操作(doing ‘remote things’)」。
$ ansible windows -i /etc/ansible/hosts -m win_file -a "path=C:\\\test state=directory"
$ ansible windows -m ping
-
- 最初の引数(”windows”)はインベントリのグループ名(”all”を指定すると全部、公式マニュアル上は”host-pattern”)
-iでインベントリファイル(デフォルトは”/etc/ansible/hosts”)を指定
-mで使うモジュール(詳細後述)を指定
-aでモジュールへの引数(argument)を指定
補充說明:庫存文件
直接使用但需要在文件中列出管理对象主机列表。通过使用[groupname]将主机分组。
[groupname]
10.1.1.1
hostname.mydomain.com
[hogeWebServers]
www1.hogehoge.com
www2.hogehoge.com
www3.hogehoge.com
可以用Ansible工具来运行playbook。
这是一个用来创建”playbook”(后述)并执行多个任务的命令。这正是Ansible的真正精髓(应该如此)。
$ ansible-playbook playbook.yml
-
- ほとんどの設定(実行サーバ等)はplaybook自体に書くので、実行時は割りとシンプル
-C or –checkをオプション指定すれば実際の変更操作は行わず、起こりうる変更を予測する(try to predict some of the changes that may occur)。
Ansible-保险库
一种用于加密和解密YAML文件的实用工具。Vault是一个地下金库(在《哈利·波特》中也出现过)。如果在Ansible的数据文件(/etc/ansible/group_vars、host_vars文件夹下)中写入了敏感信息(如密码),我们应该对其进行加密。
$ ansible-vault encrypt /etc/ansible/group_vars/windows.yml
-
- 暗号化したらansibleやansible-playbook実行時に–ask-vault-passオプションをつけるなりしないと、当然動かない
- 第一引数にcreateを指定するとエディタが開いて保存時に暗号化
功能定位 : 由Ansible提供的命令行工具
主要用途 : 管理和共享Ansible角色
简化操作 : 提供轻松安装角色的便捷方式
扩展可用性 : 通过从Ansible Galaxy社区下载新角色
高效的角色管理 : 调用、安装、删除和列出角色的支持工具
这个名字很棒。看起来是基于互联网连接(或者自己的共享存储库)的,所以这次不适用。
总之,它似乎是用来管理角色(推测是管理存储库的角色)的实用工具。
Ansible控制台
Ansible的REPL(Read-eval-print loop)是一个控制台实用工具。
$ ansible-console hogeWebServers
-m ping
-m ping
Ansible 配置
显示Ansible配置的命令。
$ ansible-config list
$ ansible-config dump
$ ansible-config view
-
- ANSIBLE_CONFIG環境変数でcfgファイルを指定(/etc/ansible/ansible.cfg overrided by ~/.ansible.cfg)
- または-c or –configオプションでオーバーライド
ansible-doc → Ansible文档
显示Ansible插件文档的实用工具。
$ ansible-doc -m ping
Ansible-清单
显示库存的实用工具。
$ ansible-inventory --graph all
$ ansible-inventory --list all
Ansible的拉取
从仓库中下载并执行”playbook”的实用工具。
模块
模块是什么?
简单来说,Ansible可以通过模块和参数来执行一些处理,而不需要在控制机上运行本地操作系统命令。这些被称为任务插件、库插件或API。当然,如果有能力的话,也可以开发自己的模块。
简而言之
以下是链接中几乎的翻译。
$ ansible webservers -m service -a "name=httpd state=started"
$ ansible webservers -m ping
使用-m指定模块,-a传递模块参数。大部分模块以”key=value”形式传递参数,当有多个参数时使用空格分隔。也有一些模块像”ping”一样不需要参数。
转换为”playbook”时,可以这样写:
- name: start the webservers
service:
name: httpd
state: started
变成这样。
$ ansible webservers -m command -a "/sbin/reboot -t now"
将其转化为”战略手册”
- name: reboot the webservers
action: command /sbin/reboot -t now
根据playbook的解释,这是一种过时的写法,而现代的方法是这样写的。
- name: reboot the webservers
command: /sbin/reboot -t now
除非自己编写模块,否则不需要太过在意,模块应返回JSON格式的响应。
模块应具有幂等性,应在执行前检查状态,如果已经达到最终形式,则最好什么都不做。
具体细节可以在实际使用时进行调查,但似乎应该先浏览一下有哪些选项。
- 全モジュールリスト
还有一些第三方制造的模块有时存在,有时则不存在。
YAML 语法
已经开始逐渐出现的”playbook”将以YAML格式记录。类似于HTML对Markdown的作用,它声称相比XML或JSON来说更加人性化,但实际效果如何呢,还不得而知。
列表和字典
在Ansible中,几乎所有的YAML文件都以列表形式开始。列表中的每个项目都是键/值对,通常被称为哈希或字典。YAML可以用”—“表示开头和结尾。
列表中的所有项目都具有相同的缩进级别,并且以“-”(破折号+一个空格)开头。
---
# A list
hogeList:
- listItem1
- listItem2
- listItem3
---
字典可以用“key: value”的形式表示(冒号后面必须有一个空格)。
---
# A dictionary
hogeDict:
name: hogename
attr: hogeattr
value: hogevalue
---
列表和字典都可以用缩写形式来编写。
---
hogeList: ['listItem1', 'listItem2', 'listItem3']
hogeDict: {name: hogename, attr: hogeattr, value: hogevalue}
---
跨越多行的指示符的情况。
如果要指定在显示时保留多行文本(类似于HTML中的
标签),或者忽略空行和换行符,,可以分别使用"|"和">"。
# みたままバージョン
asYouCanSee: |
hogehoge
the second line
the third line
# 改行等無視バージョン
ignoreLineBreaks: >
hogehoge
hogehoge
hogehoge
重要事项
如果值中有冒号,需要注意。
test: this is test: which is intended to be meaningless
drive: c:
如果继续这样下去,将会产生语法错误,但是通过使用双引号将其括起来,可以避免这个问题。
test: "this is test: which is intended to be meaningless"
drive: "c:"
然而,也有一些情况下不需要引号(由于没有提及为什么可以这样做,所以详细信息不明)。
windows_path: c:\windows
另外,在Ansible中,变量是以”{{ var }}”的格式保存的,而YAML解析器会将其解释为字典的一行形式,因此在这种情况下也需要使用双引号。此外,还要总结需要引用的其他事项。
hoge: "{{ var }}"
hoge2: "{{ basedir }}/hoge/geho" # 固定文字列を含む場合は全体をクォート
hoge3: "{{ basedir }}\\hoge\\geho" # バックスラッシュも特殊文字
hoge4: "text which includes white spaces all must be quoted" # スペースを含む文字列も全体をクォート
hoge5: "yes" # booleanではなく文字列としての"yes"
hoge6: "1.0" # 浮動少数点数ではなく文字列としての"1.0"
剧本
最后,用这个来结束。
如果模块是工具的话,”playbooks”就是操作手册,而清单则是材料(这是一个对于喜欢DIY的人来说比较容易理解的比喻,也许?)。
另外,他说,“先读一下,这些是最佳实践!”
首先,将文档中的示例直接写入。
---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: name=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
---
“key=value” 这部分也可以用字典格式表示。
---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum:
name: httpd
state: latest
- name: write the apache config file
template:
src: /srv/httpd.j2
dest: /etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service:
name: httpd
state: started
enabled: yes
handlers:
- name: restart apache
service:
name: httpd
state:restarted
---
那么,哪个更容易阅读(或易于维护,或容易从Excel或其他方式自动生成)呢?
hosts和remote_user
主持人
hosts行是一个包含一个或多个组或主机模式列表的行。如果要指定多个,则使用冒号“:”进行分隔。详细信息参见pattern部分的说明。
远程用户
需要解释的程度非常明显,表示在受管理的服务器上执行”play”命令的用户名。
可以按任务单位进行指定。
---
hosts: webservers
remote_user: root
tasks:
- name: test
ping:
remote_user: ec2-user
---
成为
指定用于使用sudo或其他权限升级方式来执行的情况。
---
hosts: webservers
remote_user: ec2-user
tasks:
- name: test
ping:
become: root
become_method: sudo
---
顺序控制
如果有多个主机被涉及,可以使用“order”来控制执行顺序。
- 存货
- 这是默认选项。按照存货文件中的顺序执行。
- 逆向存货
- 按照存货文件的逆序执行。
- 排序
- 按照执行主机名的字母降序执行。
- 逆向排序
- 按照执行主机名的字母升序执行。
- 随机
- 以随机的顺序执行。
任务清单
每个”play”都包含一个任务列表,并顺序逐个执行。出现错误的主机将被跳过。如果失败,请进行修正并重试(这就是为什么模块的幂等性在”playbook”中很重要,如果在”playbook”中使用的模块具有幂等性,那么整个”playbook”也将具有幂等性)。
给所有任务命名(使用”name”)。结果将以易读的方式输出到日志中。如果未指定,则仅显示”action”。
变量
在中文中用以下方式表达:
可以在”playbook”的vars部分或主机变量或组变量”Host Variables”和”Group Variables”中声明变量,并且可以在操作行中通过”{{varName}}”引用变量。
变量名只能包含字母(a-zA-Z)、下划线(”_”)和数字,并且必须以字母开头。
在YAML中,由于可以使用字典,因此也可以使用”[]”和”.”表示法来引用变量。
---
- hosts: webservers
vars:
hoge1: hogevalue1
hoge2: hogevalue2
tasks:
- name: test1
command: /bin/echo {{ hoge1 }}
- name: test2
command: /bin/echo {{ hoge2 }}
- name: test3
command: /bin/echo vars.hoge1
- name: test4
command: /bin/echo vars['hoge2']
---
以下为给出的中文翻译:
处理器
如果我们想要定义一个任务,用于更改配置文件,并只有在实际发生更改时才重新启动特定的服务,那么我们可以使用处理器来实现。
---
- hosts: webservers
tasks:
- name: replace httpd.conf
template:
src: template.conf
dest: /etc/apache/conf/httpd.conf
notify:
- restart memcached
- restart apache
handlers:
- name: restart memcached
service:
name: memcached
state: restarted
- name: restart apache
service:
name: apache
state: restarted
---
在”nofify”字段指定的列表中,会有处理程序(handler),在”handlers”部分中会包含实际的操作(与一般的”tasks”几乎相同)。在”handlers”部分的列表中,设置”name”字段为处理程序中定义的字符串(需要在全局中唯一)。
需要注意的是,”handlers”动作的执行顺序是按照定义的顺序进行,而不是按照”notify”的顺序。
另外,还可以将”listen”添加到”handlers”的任务中来实现不同的方法。
---
tasks:
- name: replace httpd.conf
template: src=template.conf dest=/etc/apache/conf/httpd.conf
nofity: "restart web services"
handlers:
- name: restart memecached
service: name=memcached state=restarted
listen: "restart web services"
- name: restart apache
service: name=apache state=restarted
listen: "restart web services"
---
此外,如果想要执行所有处理程序,可以通过插入”meta”行来实现。
tasks:
- shell: /bin/echo executing all handler tasks
- meta: flush_handlers
- shell: /bin/echo done
YAML 语法检查
使用ansible-playbook命令时,可以通过添加–syntax-check选项来进行确认。此外,要确认执行的目标主机,请添加”–list-hosts”选项。
$ ansible-playbook playbook.yml --syntax-check
$ ansible-playbook playbook.yml --list-hosts

虽然 Ansible 看起来仍然很深奥,或者说底蕴很深,但如果有必要,我愿意再深入学习一些。