《枪炮、病菌与钢铁》和邓小平的惊人远见

《枪炮、病菌与钢铁》和邓小平的惊人远见

者| 刘胜

来源| 亚当斯密经济学(ID:adamsmitheconomics)

 

01

1978 年“三落三起”的邓小平,以非凡的历史远见,提出“改革开放”,彻底扭转了国家命运,开启了中华民族复兴的大门。

 

在漫长的中国历史上,不乏勇敢无畏的改革家——商鞅、王安石、张居正是其中的代表人物。然而,两千多年来无数次“变法图强”的努力,最终不过也历史长河中的一朵朵浪花,始终无法跳出“其兴也勃焉其亡也忽焉”的历史周期律。“秦人不暇自哀,而后人哀之;后人哀之而不鉴之,亦使后人而复哀后人也”,这句话似乎成了历史魔咒。

 

《枪炮、病菌与钢铁》和邓小平的惊人远见

 

拉长历史视野来看,邓小平开启的“变法”,不仅是新中国发展的转折点,也是两千年来中华文明的一次“历史性大突围”

 

从方法论角度看,在历史上第一次将“改革”与“开放”联系起来,这不仅顺应了 20 世纪后期的世界潮流,也让中国得以“借鉴发达国家的经验”发挥“后发优势”,更通过“以开放倒逼改革”解决了改革动力不足的难题。

 

《枪炮、病菌与钢铁》和邓小平的惊人远见

 

总体上来看,“封闭性”是中华文明的重要特质,从秦朝“修长城”到明代“禁海运”,都是这一“内向文明”的心态体现。然而,“封闭性”必然导致“保守性”,在历史的停滞期这无关大碍,但一旦遇到“人类文明突破期”,落后挨打就不可避免。“改革开放”彻底扬弃了中华文明的封闭性,因为开放的大门一旦打开就没法再关上。

 

《枪炮、病菌与钢铁》和邓小平的惊人远见

图源:国家地理中文网

 

实践是检验真理的唯一标准。实践证明,改革开放是改写中国命运的关键一招:

 

印度现在的人均 GDP 只有中国的 1/4 。但是如果回顾一下历史,你会大吃一惊。1978 年改革开放之初,中国的人均GDP(156 美元)比印度(205 美元)还低,直到 1991 年中国才第一次超越印度。从此,一发不可收拾,龙象渐行渐远。

 

《枪炮、病菌与钢铁》和邓小平的惊人远见

 

02

邓小平的“开放”思维,或许来自多重因素:

 

• 他早年法国勤工俭学的经历塑造了他的世界格局。

 

• 1978 年谷牧率团欧洲考察“整体上至少落后 20 年”的结论深深刺痛了领导层。

 

• 冷静的观察:1979 年 1 月邓小平访美,陪同出访的中国社会科学院副院长兼美国研究所所长李慎之(80-90 年代的顶尖思想家:南有王元化,北有李慎之)在飞机上问邓小平:“我们为什么要这么重视同美国的关系?”邓小平回答说:“回头看看这几十年来,凡是和美国搞好关系的国家,都富起来了。”话虽直白,但的确是小平同志几十年冷静观察思考的洞见。

 

《枪炮、病菌与钢铁》和邓小平的惊人远见

 

“开放”并非小平的一时权宜,而是基本国策。他的这种历史坚定感在下面两段话中体现的淋漓尽致:

 

他谈到保持香港制度不变时说,“我们说不变。只讲不变还是空的。我们考虑定个年限,总的是保持香港自由港、国际金融中心的地位,还有法律等等。我们先来个 50 年不变好不好?50 年够长了。讲 50 年比不讲年限好,更能使大家放心”。

 

邓小平在退隐之前提出了“冷静观察、稳住阵脚、沉着应付、韬光养晦、善于守拙、决不当头、有所作为”的锦囊妙计,更是富有历史深意:

 

1)虽然彼时还没有提出“修昔底德陷阱”这个名词,但小平内心是极为敏感的——这情商真是爆棚!;

 

2)他深知,要以“开放”来融化中华文明的“封闭性”特质,非一日之功,必须要有历史定力。

 

《枪炮、病菌与钢铁》和邓小平的惊人远见

 

03

经典名著《枪炮、病菌与钢铁》指出:

 

欧亚大陆率先驯化出动植物,推动了人类定居,这是欧亚大陆迅速与非洲、新大陆拉开距离的原因。

 

《枪炮、病菌与钢铁》和邓小平的惊人远见

 

但,同属欧亚大陆,“为什么新月沃地和中国把它们几千年的巨大领先优势让给了起步晚的欧洲”?

 

《枪炮、病菌与钢铁》和邓小平的惊人远见

 

对这一“李约瑟之谜”,《枪炮、病菌与钢铁》给出了一个独特的解释:

 

了解中国把政治和技术的卓越地位让给欧洲的关键所在就是去了解中国的长期统一和欧洲的长期分裂。中国在公元前 221 统一后就再也没有任何其他独立的国家可以在中国出现并长期存在下去。分裂局面最后总是重新统一。欧洲就连拿破仑、希特勒这些铁腕征服者都无能为力——罗马帝国鼎盛时期所控制的地区也没有超过欧洲的一半。

 

《枪炮、病菌与钢铁》和邓小平的惊人远见

△英国脱欧折射出欧洲分裂的悠久历史传统

 

中国在地理上的四通八达最后却成了一个不利条件:某个君主的一个决定就能使改革创新半途而废。欧洲地理上的分割,形成几十个相互竞争的小国和发明创造的中心,如果某个国家没有去改革创新,另一个国家会去那样做的,从而迫使邻国也这样去做。

 

中国在政治上是统一的,明朝皇帝一个决定就使整个中国停止了船队的航行。那个一时的决定是不可逆的。在欧洲情形截然不同,哥伦布出生于意大利,后来为法国的公爵服务,又后来改事葡萄牙国王,航行探险的请求被葡萄牙国王拒绝后,他又求助于西班牙国王和王后,他们拒绝了他的第一次请求,但再次请求时同意了。如果欧洲在这三个统治者中任何一个的统治下统一起来,它对美洲的殖民也许一开始就夭折了。正是由于欧洲是分裂的,哥伦布才成功地在几百个王公贵族中说服一个来赞助他的航海梦想。

 

《枪炮、病菌与钢铁》和邓小平的惊人远见

△我指着大海的方向:巴塞罗那哥伦布纪念碑

 

欧洲的分裂所产生的这些结果与中国的统一产生的结果形成鲜明对比。中国的朝廷还作出一系列停止其他活动的决定:放弃开发一种精巧的水力驱动的纺纱机,在制造机械钟方面领先世界后又把它拆毁或几乎完全破坏了,15 世纪晚期以后不再发展机械装置和一般技术。

 

《枪炮、病菌与钢铁》和邓小平的惊人远见

△英国特使“求见”中国皇帝

 

中国距离欧亚大陆其他先进的国家路途遥远,使中国实际上成为一个大陆内的巨大孤岛。这令人想起了太平洋上的孤岛。

 

《枪炮、病菌与钢铁》和邓小平的惊人远见

△长期与世隔绝的新几内亚岛

 

读到此处,不能不为邓小平对中国历史的“深刻理解”所深深折服。邓小平的“改革开放”一下打通了中国社会转型突破的“任督二脉”,千年玲珑棋局就此破解。

 

我想起了德国俾斯麦那句名言:

政治家的任务就是倾听上帝在历史上走过的脚步声,并当他在身旁经过时努力抓住他上衣的后下摆,跟他一起前进。

 

《枪炮、病菌与钢铁》和邓小平的惊人远见

头图| Ritomm

排版| Seagull

转自:https://mp.weixin.qq.com/s/myasZ0xEZzRMgPvDSad6tg

BMJ:盐一换,每年少死45万!基于中国人的试验显示,换用含25%氯化钾的低钠盐,预计全国每年减少45万例心血管死亡丨临床大发现

 

 

传说白毛女头发白是因为没盐吃,现在的中国人大概是没这个烦恼了,毕竟中国人的平均每日食盐摄入量已经达到WHO推荐上限的两倍了。盐吃多了,水钠潴留,血压就上去了,心血管风险也随之增高。

 

吃盐多了血压高,吃盐少了饭不香,只好用低钠盐了。在秘鲁进行的一项研究就显示,使用含25%氯化钾的低钠盐代替食盐,可以降低51%的高血压风险。不过中国人的饮食跟秘鲁的差异还是蛮大的,起码咱们没有羊驼肉吃。而且慢性肾病患者使用含钾的低钠盐有高血钾的风险,也被排除在了那项研究之外。

 

近日,新南威尔士大学的Matti Marklund联合北京大学等处的科学家,分析了中国食盐替代与中风研究(SSaSS)的数据,发现如果在中国使用含25%氯化钾的低钠盐替代食盐,将能每年减少45万例心血管死亡,减少了11%即使是慢性肾病患者,使用低钠盐代替食盐也是利大于弊。这一研究发表在BMJ上[1]。

 

BMJ:盐一换,每年少死45万!基于中国人的试验显示,换用含25%氯化钾的低钠盐,预计全国每年减少45万例心血管死亡丨临床大发现

(来自pixabay.com)

 

在中国,35~75岁的人中,有45%患有高血压[2],这可是心血管疾病的头号危险因素。2015年,大约就有230万人因高血压而死,相比1990年增加了89%[3]。据估计,中国大约1/7的心血管死亡可归因为高钠摄入,也就是盐吃多了[4]。

 

据统计,中国人70%的钠摄入来自家庭烹饪[5]。减少家庭烹饪的用盐量,对于心血管疾病的预防至关重要。

 

低钠盐是一种含钠较少的盐,一般使用25%~67%的氯化钾替换掉食盐中的氯化钠。使用这样的盐大约能降低5mmHg的收缩压和2mmHg的舒张压。在中国台湾进行的一项研究也显示,使用低钠盐与较少的心血管死亡相关[6]。

 

BMJ:盐一换,每年少死45万!基于中国人的试验显示,换用含25%氯化钾的低钠盐,预计全国每年减少45万例心血管死亡丨临床大发现

pixabay.com

 

不过低钠盐少了钠却多了钾。钾这个东西,也会带来一定的风险。尤其是对于慢性肾病患者,肾功能差,吃进去的钾排不出去就容易造成高血钾,进而影响神经肌肉的电生理活动,造成心律失常,甚至心脏骤停。更何况高血压本身就是慢性肾病的危险因素之一

 

而且这还不是说慢性肾病患者不用低钠盐就能解决的。中国有不少慢性肾病患者根本不知道自己的病情[7]。评估换盐在中国的收益必须要纳入慢性肾病患者!

 

BMJ:盐一换,每年少死45万!基于中国人的试验显示,换用含25%氯化钾的低钠盐,预计全国每年减少45万例心血管死亡丨临床大发现

pixabay.com

 

研究人员对中国食盐替代与中风研究(SSaSS)[8]的数据进行了建模分析。

 

SSaSS是一项大规模集群随机试验,在中国北方辽宁、山西、河北、宁夏和陕西的600个村庄进行,每个村庄大约有35人被纳入研究。

 

研究人员给参与者分发含有30±10%氯化钾的低钠盐,平均氯化钾含量为25%。低钠盐的发放剂量十分充足,除了日常的炒菜做饭,腌制腊肉等等保存食物要用的盐也被涵盖在内

 

经过大约5年的跟踪,研究人员发现,使用低钠盐大约减少了0.32g的24小时尿钠,增加了0.77g的24小时尿钾,降低了2.65mmHg的收缩压,舒张压的变化不显著。

 

根据这一结果,以及中国慢性肾病患病率、血清钾对心血管死亡影响等等数据,研究人员对在全国范围内使用低钠盐代替食盐的收益进行了评估。

 

BMJ:盐一换,每年少死45万!基于中国人的试验显示,换用含25%氯化钾的低钠盐,预计全国每年减少45万例心血管死亡丨临床大发现

评估流程

 

评估结果显示,全国范围内换用低钠盐的降压作用,每年大约可以减少46.1万例心血管死亡,其中包括20.8万例卒中死亡和17.5万例缺血性心脏病死亡,相当于全国心血管死亡的10.9%。此外,换盐还预计可以每年减少74.3万例非致命心血管事件,减少6.9%的慢性肾病发病率

 

对于全国1720万慢性肾病患者,换用低钠盐的降压作用预计可以减少3.2万例心血管死亡,而换用低钠盐的高血钾风险大约会增加1.1万例额外的心血管死亡,净减少了2.1万例心血管死亡

 

慢性肾病患者中换用低钠盐也是利大于弊的!

 

BMJ:盐一换,每年少死45万!基于中国人的试验显示,换用含25%氯化钾的低钠盐,预计全国每年减少45万例心血管死亡丨临床大发现

全人群和慢性肾病患者中,换盐都是利大于弊的

 

论文第一兼通讯作者Marklund表示:“我们的研究表明,以低钠盐替代普通盐进行家庭烹饪的国家计划,可能会对中国的CVD负担产生重大影响。”

 

就是不知道低钠盐的味道怎么样,希望吃过的小伙伴在评论区分享。

参考文献:

1. MARKLUND M, SINGH G, GREER R, et al. 2020. Estimated population wide benefits and risks in China of lowering sodium through potassium enriched salt substitution: modelling study. BMJ [J], 369: m824.

2. Lu J, Lu Y, Wang X, et al. Prevalence, awareness, treatment, and control of hypertension in China: data from 1· 7 million adults in a population-based screening study (China PEACE Million Persons Project)[J]. The Lancet, 2017, 390(10112): 2549-2558.

3. Cheng S, Claggett B, Correia A W, et al. Temporal trends in the population attributable risk for cardiovascular disease: the Atherosclerosis Risk in Communities Study[J]. Circulation, 2014, 130(10): 820-828.

4. Mozaffarian D, Fahimi S, Singh G M, et al. Global sodium consumption and death from cardiovascular causes[J]. New England Journal of Medicine, 2014, 371(7): 624-634.

5. Du S, Wang H, Zhang B, et al. Dietary Potassium Intake Remains Low and Sodium Intake Remains High, and Most Sodium is Derived from Home Food Preparation for Chinese Adults, 1991–2015 Trends[J]. The Journal of Nutrition, 2020.

6. Newberry S J, Chung M, Anderson C A M, et al. Effects of dietary sodium and potassium intake on chronic disease outcomes and related risk factors[J]. Agency for Healthcare Research and Quality (AHRQ), 2018.

7. Wang F, Zhang L, Wang H. Awareness of CKD in China: a national cross-sectional survey[J]. American Journal of Kidney Diseases, 2014, 63(6): 1068-1070.

8. Huang L, Tian M, Yu J, et al. Interim effects of salt substitution on urinary electrolytes and blood pressure in the China Salt Substitute and Stroke Study (SSaSS)[J]. American Heart Journal, 2020.

头图pixabay.com

 

本文作者 | 孔劭凡

转自:https://mp.weixin.qq.com/s/Xgc_AEcrUrM3Z8JKh0g8vQ

这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!

橘子:五一小长假就在眼前了,感觉生活都需要来一个“旧貌换新颜”。在英文里,这叫 makeovers

比如,换换自己的模样 ….before … after …

这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
或者,把家来个 makeover … before … after …
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!

Before … after … 这种 “旧貌换新颜”,是不是很让人动心? 原来我们自己、我们的生活,还有这么多可能性 …
这种动动手改善生活小环境的事情,咱们万能的花友做得就非常漂亮 …
比如最近花友@随风摇摆的海草 在我们的App社区就分享了一件开心事。这段时间,她抽空把家里的阳台给改造了 …
改造前的阳台,东面 …
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
改造前的阳台,西面 …
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
改造后的阳台,东面 …
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
早上小朋友在光线极佳的阳台书桌边,晨读 … 
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
改造后的阳台,西面 …
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
养花种草晒太阳,收拾好了,就等花开了🌸 …
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
很多人问怎么晾衣服?两排晾衣架都在天花板上,可升降的,不妨碍 …
震撼吧?动心吧?这个小长假,带娃的哪敢到处跑,不如在家小小折腾一下,就算简单换换软装,做点小调整,也能带来好心情。
那么,给自己家做 makeover,从何下手呢?今天,给大家带来一组国外家庭改善居住环境的例子,咱们不必也不可能照着做,但其中的思路,ideas,我觉得还是可以有所借鉴的。
好,来看案例,是否能找到一些灵感~
孩子第一,先来看看能给小朋友做些什么 …

假如你有机会“从头开始”,就给小孩一个“梦幻童年房”吧 …
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
假如你家又有一个小宝贝出生,就把你的“次卧+书房”让出来 ... (Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
👶打造一个“蓝天白云” 育婴房 … (After)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
假如好好的屋子,给娃搞成这样 …  (Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
那么就做两件事:1、改造收纳空间,多做一些靠墙的柜子  2、把娃“训”一顿,必须养成整理房间好习惯 … (After)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
柜子也不少,为什么这么乱?因为收纳时没有合理布局,东西如何分类摆放没有章法 …  (Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
解决方法:用各种储物盒把零碎小东西“归纳”起来;柜子上端还可以用大一些的储物盒继续利用空间 … (After)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
书房里放这种孤零零的桌子,真心不好用,收纳能力几乎为零 … 空间太浪费了!蓝色的墙面让房间又显得封闭、狭小 … (Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
换一张更能利用空间,有更多收纳能力的“立体”桌子,再把墙面换成暖色调,感觉温暖、宽敞、有爱 … (After)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
最近全世界小朋友都在家上网课。电脑、打印机这类设备,加上书啊文件啊,估计多数小孩就是在一堆乱糟糟中学习奋斗。比如这间,桌上堆得要满出来了,墙面却光秃秃没用上,桌下还塞着一堆杂碎 …  (Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
值得改一改。来点实用的创意。书桌前的墙一定要用起来。比如,装20个圆形磁力板,把课程表啊、照片、笔筒啊,都“吸挂”上去 …
书桌侧边的墙面也要用起来,比如装三层架子,搭配各种储物盒,收纳书本纸张。再注意一些软装,把椅子和纸筒换成更轻巧的。在整齐的房间里、书桌前学习,对孩子的心情、注意力都有好处 …  (After)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
看完孩子的,再来看我们自己的 …
首先看书房。
家里的书房有没有像这样?书桌、书架有好多,为什么还是乱糟糟?而且,地毯颜色和墙面颜色的搭配,如此“违和” …  (Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
改一改吧!换一整面结实的墙上搁板,能储物,还能当书桌。长长的台面足够俩人工作。把笨重的书桌书架“请”出去后,空间好像大出了一倍。
再用储物盒收纳杂志文件,凌乱感就没了。椅子、靠垫、地毯的颜色特别赞,清爽和谐,浅色调也能让房间显得更大 … (After)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
再来看一间书房。瞧这乱的,这吊灯,那么丑! (Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
重来!一下安装了5层搁架,没有一寸空间可以浪费。注意细节,桌子墙上的金属网格文件夹、小贴板,是不是很贴心? (After)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
看完书房,再来看看家里的各种门厅、过道之类的边边角角怎么改造才能又美又好用 …
比如,门厅。一进门就是这里,门厅的风格给整屋奠定了基调。
这个门厅,挺清爽的,但好好好“寡淡”,没有一丝温馨,也没有一丝想象力 … (Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!

来个大胆的 makeover 吧,比如这大胆的红色,一定会亮瞎来访朋友的眼睛。这种红白条进门地毯好像宜家就有。可以坐下来换鞋,还有储物柜。出门前,可以照照大镜子,保证一家人“美貌不掉线“ … (After)

这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
再看个门厅。如果你朋友家是这样的,马上就知道这家人的生活习惯有点”简陋“,人有点懒 … (Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
Again,需要严重改造。重新刷个墙,关键是问墙面要空间,还有做合理的储物布局 …  (After)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
这是一家人通往厕所的一个狭长空间。这家肯定不止一个娃,乱成这样 …  (Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
怎么办?一句话,要舍得买柜子!很喜欢墙上这个钟,家里人多,早上请注意不要霸占厕所!(After)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
这是老外家一般都有的洗衣房,大致对应我们的杂货间。注意到了吗?这间里还有一个跑步机。这么乱,我肯定不愿意在这样的环境里跑步!(Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
把跑步机换个位置,前面挂个小电视(我可以跑了)。再把杂物放入储物盒搁在架子上,凌乱感当然无存。这张薄荷绿的挂墙小桌,好可爱 … (After)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!

最后,来看看家里利用率最高的两个地方,厨房、卫生间 …

必须说,这种深木色美式厨房,好土!这墙纸的颜色,还有希望“挽救”么?(Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
怎么改?改柜子,还是改墙纸?结果 … 成这样了!仔细观察这一大片白色,增加的收纳设计真不少。(After)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
尤其,全白+红色波点,好像是草间弥生家的厨房 …

这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!

再给一个厨房案例。改造前,这个厨房的主人是文艺青年,一面墙的零碎陶器和植物,料理台面很少很小 …(Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
改造后,主人不切实际的“文艺青年风”换成了脚踏实地的“家庭主妇风”。把各种陶器植物摆设请出来,换成柜子、架子、搁板 … 窗边的酒架子,挺赞!(After)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
最后一组,也是最后一个地方,卫生间。
看了前面那么多,是不是感觉工程还是有点大,来个简单的吧。
这个小浴室,土得像上世纪60年代的,颜色搭配辣眼睛。现代卫生间一般都配有“医药杂物柜” (medicine cabinet),在哪儿呢?(Before)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!
简单,做四件事:
 
1、首先,请统一颜色风格 … 有了蓝色,为什么还要黄色呢?把墙涂白!
2、请把古老的乡村田园风柜子把手,换掉!
3、请把这土的掉渣的花色浴帘,换掉!
4、有空打个柜子吧!
这样的风格,是不是更接近21世纪,也更实用?(After)
这些活生生的“房间改造”例子告诉我们:动一动,就能出奇迹!

好了,Before & After,今天就分享到这里。总结一下,窍门有三:

 

1、请把墙面空间充分利用起来!

2、请用大柜子替代小柜子,并且多用储物盒!

3、请注意审美,不能土!不能土!!!

转自:https://mp.weixin.qq.com/s/jBVkZ7HOGrYMyPxHH_ucqA

别让运维太忙,一文详解 Ansible 的自动化运维

一、Ansible 概述

Ansible 是近年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误。Ansible 通过本身集成的非常丰富的模块可以实现各种管理任务,其自带模块超过上千个。更为重要的是,它操作非常简单,即使小白也可以轻松上手,但它提供的功能又非常丰富,在运维领域,几乎可以做任何事。

1、Ansible 特点

Ansible 自 2012 年发布以来,很快在全球流行,其特点如下:

  • Ansible 基于 Python 开发,运维工程师对其二次开发相对比较容易;
  • Ansible 丰富的内置模块,几乎可以满足一切要求;
  • 管理模式非常简单,一条命令可以影响上千台主机;
  • 无客户端模式,底层通过 SSH 通信;
  • Ansible发布后,也陆续被 AWS、Google Cloud Platform、Microsoft Azure、Cisco、HP、VMware、Twitter 等大公司接纳并投入使用;

二、Ansible的角色

  • 使用者:如何使用 Ansible 实现自动化运维?
  • Ansible 工具集:Ansible 可以实现的功能?
  • 作用对象:Ansible 可以影响哪些主机?

1、使用者

如下图所示:Ansible 使用者可以采用多种方式和 Ansible 交互,图中展示了四种方式:

  • CMDB:CMDB 存储和管理者企业IT架构中的各项配置信息,是构建 ITIL 项目的核心工具,运维人员可以组合 CMDB 和 Ansible,通过 CMDB 直接下发指令调用Ansible 工具集完成操作者所希望达到的目标;
  • PUBLIC/PRIVATE 方式:Ansible 除了丰富的内置模块外,同时还提供丰富的 API语言接口,如PHP、Python、PERL 等多种流行语言,基于 PUBLIC/PRIVATE,Ansible 以 API 调用的方式运行;
  • Ad-Hoc 命令集:Users直接通过Ad-Hoc命令集调用Ansible工具集来完成任务;
  • Playbooks:Users 预先编写好 Ansible Playbooks,通过执行
  • Playbooks 中预先编排好的任务集,按序执行任务;

2、Ansible 工具集

Ansible 工具集包含 Inventory、Modules、Plugins 和 API。其中:Inventory:用来管理设备列表,可以通过分组实现,对组的调用直接影响组内的所有主机;Modules:是各种执行模块,几乎所有的管理任务都是通过模块执行的;Plugins:提供了各种附加功能;API:为编程人员提供一个接口,可以基于此做 Ansible的二次开发;具体表现如下:

  • Ansible Playbooks:任务脚本,编排定义Ansible任务及的配置文件,由Ansible按序依次执行,通常是JSON格式的YML文件;
  • Inventory:Ansible 管理主机清单;
  • Modules:Ansible 执行命令功能模块,多数为内置的核心模块,也可自定义;
  • Plugins:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不太常用;
  • API:供第三方程序调用的应用程序编程接口;
  • Ansible:该部分图中表现得不太明显,组合 Inventory、API、Modules、Plugins可以理解为是 Ansible 命令工具,其为核心执行工具;

3、作用对象

Ansible 的作用对象不仅仅是 Linux 和非 Linux 操作系统的主机,也可以作用于各类PUBLIC/PRIVATE、商业和非商业设备的网络设施。使用者使用 Ansible 或 Ansible-Playbooks 时,在服务器终端输入 Ansible 的 Ad-Hoc命令集或 Playbooks 后,Ansible 会遵循预选安排的规则将 Playbooks 逐步拆解为Play,再将 Play 组织成 Ansible 可以识别的任务,随后调用任务涉及的所有模块和插件,根据 Inventory 中定义的主机列表通过 SSH 将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果是临时文件则执行完毕后自动删除。

三、Ansible的配置

1、Ansible安装

Ansible的安装部署非常简单,以RPM安装为例,其依赖软件只有Python和SSH,且系统默认均已安装。Ansible的管理端只能是Linux,如Redhat、Debian、Centos。

1)通过YUM安装Ansible

可以自行从互联网上直接下载Ansible所需软件包,本篇博客提供安装Ansible自动化运维工具所需的依赖软件包

[root@centos01 ~]# cd /mnt/ansiblerepo/ansiblerepo/repodata/[root@centos01 ansiblerepo]# vim /etc/yum.repos.d/local.repo[local]name=centosbaseurl=file:///mnt/ansiblerepo/ansiblerepo  <!--修改yum路径-->enabled=1gpgcheck=0[root@centos01 ~]# yum -y install ansible                <!--安装Ansible自动化运维工具-->

2)验证安装结果

[root@centos01 ~]# ansible --version    <!--如果命令可以正常执行,则表示Ansible工具安装成功-->ansible 2.3.1.0  config file = /etc/ansible/ansible.cfg  configured module search path = Default w/o overrides  python version = 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]

3)创建 SSH 免交互登录

Ansible 通过 SSH 对设备进行管理,而 SSH 包含两种认证方式:一种是通过密码认证,另一种是通过密钥对验证。前者必须和系统交互,而后者是免交互登录。如果希望通过 Ansible 自动管理设备,应该配置为免交互登录被管理设备。

[root@centos01 ~]# ssh-keygen -t rsa  <!--生成密钥对-->Generating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa):<!--密钥对存放路径-->Created directory '/root/.ssh'.Enter passphrase (empty for no passphrase):       <!--输入私钥保护密码,直接按Enter键表示无密码-->Enter same passphrase again:    <!--再次输入-->Your identification has been saved in /root/.ssh/id_rsa.Your public key has been saved in /root/.ssh/id_rsa.pub.The key fingerprint is:SHA256:cJz6NRTrvMDxX+Jpce6LRnWI3vVEl/zvARL7D10q9WY root@centos01The key's randomart image is:+---[RSA 2048]----+|          .   . .||       . . +   oo||      . = o o. oo||       = * o..+ *||      . S *.=+=*+||       . o =+XooE||        . ..=.++.||           ..o ..||           .. o. |+----[SHA256]-----+[root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub  root@192.168.100.20   <!--复制公钥到远端192.168.100.20-->[root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub  root@192.168.100.30    <!--复制公钥到远端192.168.100.30-->

至此,已经完成 Ansible 的部署,接下来就可以通过 Ansible 对设备进行管理了。

2、Ansible 配置

Inventory 是 Ansible 管理主机信息的配置文件,相当于系统 Hosts 文件的功能,默认存放在 /etc/ansible/hosts。在 hosts 文件中,通过分组来组织设备,Ansible 通过 Inventory 来定义主机和分组,通过在 ansible 命令中使用选项-i—inventory-file来指定 Inventory。

[root@centos01 ~]# ansible -i /etc/ansible/hosts web -m ping

如果使用默认的 Inventory文件(/etc/ansible/hosts),也可以不指定 Inventory 文件,例如:

[root@centos01 ~]# ansible web -m ping

Ansible 通过设备列表以分组的方式添加到 /etc/ansible/hosts 文件来实现对设备的管理,所以在正式管理之前,首先要编写好 hosts 文件。hosts 文件中,以[ ]包含的部分代表组名,设备列表支持主机名和IP地址。默认情况下,通过访问22端口(SSH)来管理设备。若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口标明,以行为单位分隔配置。另外,hosts文件还支持通配符。

[root@centos01 ~]# vim /etc/ansible/hosts............   <!--此处省略部分内容-->[web]192.168.100.20192.168.100.30[test]www.benet.com:222                         <!--通过222端口管理设备-->[mail]yj1.kgc.cnyj[2:5].kgc.cn<!--[2:5]表示2~5之间的所有数字,即表示yj2.kgc.cn、yj3.kgc.cn……的所有主机-->

可以将一个主机同时归置在不同的组中。配置完成之后,可以针对hosts定义的组进行远程操作,也可以针对组中的某一个或多个主机操作。例如:1)只对web组中192.168.1.2主机操作,通过—limit参数限定主机的变更。

[root@centos01 ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.100.20"192.168.100.20 | SUCCESS | rc=0 >><!--看到SUCCESS就知道成功了,所以以下内容--><!--如果测试httpd服务,被测试主机必然已经安装并启动了httpd服务-->

2)只对192.168.100.20主机操作。通过IP限定主机的变更。

[root@centos01 ~]# ansible 192.168.100.20 -m command -a "systemctl status httpd"192.168.100.20 | SUCCESS | rc=0 >>

3)只对192.168.100.0网段主机操作,这就需要使用到通配符来限定主机的变更了。

[root@centos01 ~]# ansible 192.168.1.* -m command -a "systemctl status httpd"192.168.100.20 | SUCCESS | rc=0 >>.......  <!--此处省略部分内容-->192.168.100.30 | SUCCESS | rc=0 >>.......    <!--此处省略部分内容--><!--实验环境,效果一样,这里就不多说了-->

3、Ansible 命令

Ansible 的维护命令大多数是以 ansible 开头,在终端输入 ansible 后连续按两次Tab键,会补全所有跟 ansible 相关的命令。

[root@centos01 ~]# ansible  <!--连续按Tab键-->ansible               ansible-console-2     ansible-galaxy        ansible-playbook-2.7  ansible-vault-2ansible-2             ansible-console-2.7   ansible-galaxy-2      ansible-pull          ansible-vault-2.7ansible-2.7           ansible-doc           ansible-galaxy-2.7    ansible-pull-2ansible-connection    ansible-doc-2         ansible-playbook      ansible-pull-2.7ansible-console       ansible-doc-2.7       ansible-playbook-2    ansible-vault

1)ansible

ansible 是生产环境中使用非常频繁的命令之一,主要在以下场景使用:非固化需求;临时一次性操作;二次开发接口调用;非固化需求是指临时性的维护,如查看web服务器组磁盘使用情况、复制一个文件到其他机器等。类似这些没有规律的、临时需要做的任务,我们成为非固化需求,临时一次性操作,语法如下:

Ansible  <host-pattern> [options]
  • -v(—verbose):输出详细的执行过程信息,可以得到执行过程所有信息;
  • -i PATH(—inventory=PATH):指定inventory信息,默认为/etc/ansible/hosts;
  • -f NUM(—forks=NUM):并发线程数,默认为5个线程;
  • —private-key=PRIVATE_KEY_FILE:指定密钥文件;
  • -m NAME,—module-name=NAME:指定执行使用的模块;
  • -M DIRECTORY(—module-path=DIRECTORY) :指定模块存放路径,默认为/usr/share/ansible;
  • -a ARGUMENTS(—args=ARGUMENTS):指定模块参数;
  • -u USERNAME(—user=USERNAME):指定远程主机以USERNAME运行命令;
  • -l subset(—limit=SUBSET):限制运行主机;

①检查所有主机是否存活,执行命令如下:

[root@centos01 ~]# ansible all -f 5 -m ping<!--调用ping模块,all表示/etc/ansible/hosts文件中的所有主机,不用创建all分组(默认存在)-->192.168.100.20 | SUCCESS => {               <!--表示执行成功-->    "changed": false,                        <!--没有对主机做出更改-->    "ping": "pong"                  <!--表示执行ping命令的返回结果-->}192.168.100.30 | SUCCESS => {    "changed": false,    "ping": "pong"}

②列出web组所有的主机列表,执行命令如下:

[root@centos01 ~]# ansible web --list      <!-- --list:表示列出主机列表信息-->  hosts (2):    192.168.100.20    192.168.100.30

③批量显示web组中的磁盘使用空间,执行命令如下:

[root@centos01 ~]# ansible web -m command -a "df -hT"192.168.100.30 | SUCCESS | rc=0 >>文件系统            类型      容量  已用  可用 已用% 挂载点/dev/mapper/cl-root xfs        17G  4.4G   13G   26% /devtmpfs            devtmpfs  897M     0  897M    0% /devtmpfs               tmpfs     912M   84K  912M    1% /dev/shmtmpfs               tmpfs     912M     0  912M    0% /sys/fs/cgroup/dev/sda1           xfs      1014M  173M  842M   18% /boottmpfs               tmpfs     183M   16K  183M    1% /run/user/42tmpfs               tmpfs     183M     0  183M    0% /run/user/0192.168.100.20 | SUCCESS | rc=0 >>文件系统            类型      容量  已用  可用 已用% 挂载点/dev/mapper/cl-root xfs        17G  4.3G   13G   26% /devtmpfs            devtmpfs  897M     0  897M    0% /devtmpfs               tmpfs     912M   84K  912M    1% /dev/shmtmpfs               tmpfs     912M     0  912M    0% /sys/fs/cgroup/dev/sda1           xfs      1014M  173M  842M   18% /boottmpfs               tmpfs     183M   16K  183M    1% /run/user/42tmpfs               tmpfs     183M     0  183M    0% /run/user/0/dev/sr0            iso9660   4.1G  4.1G     0  100% /mnt

web关键字需要提前在/etc/ansible/hosts文件中定义组。Ansible的返回结果非常友好,一般会用三种颜色来表示执行结果:

  • 红色:表示执行过程出现异常;
  • 橘黄颜色:表示命令执行后目标有状态变化;
  • 绿色:表示执行成功且没有目标机器做修改;

2)Ansible-doc

Ansible-doc用来查询ansible模块文档的说明,类似于man命令,针对每个模块都有详细的用法说明及应用案例介绍,语法如下:

ansible-doc [options] [module……]

列出支持的模块:

[root@centos01 ~]#ansible-doc -l

查询ping模块的说明信息:

[root@centos01 ~]# ansible-doc ping> PING    (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)  A trivial test module, this module always returns `pong' on successful contact. It  does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify  the ability to login and that a usable python is configured. This is NOT ICMP ping,  this is just a trivial test module.EXAMPLES:# Test we can logon to 'webservers' and execute python with json lib.ansible webservers -m pingMAINTAINERS: Ansible Core Team, Michael DeHaanMETADATA:        Status: ['stableinterface']        Supported_by: core

3)Ansible-playbook

Ansible-playbook是日常应用中使用频率最高的命令,类似于Linux中的sh或source命令,用来执行系列任务。其工作机制:通过读取预先编写好的playbook文件实现集中处理任务。Ansible-playbook命令后跟yml格式的playbook文件,playbook文件存放了要执行的任务代码,命令使用方式如下:

Ansible-playbook playbook.yml<!--playbook.yml文件要提前编写好,建议使用绝对路径-->

4)Ansible-console

Ansible-console是Ansible为用户提供的一款交互式工具,类似于Windows的cmd或者是Linux中shell。用户可以在ansible-console虚拟出来的终端上像shell一样使用Ansible内置的各种命令,这为习惯于使用shell交互式方式的用户提供了良好的使用体验。在终端输入ansible-console命令后,显示如下:

[root@centos01 ~]# ansible-consoleWelcome to the ansible console.Type help or ? to list commands.      <!--输入help或?获取帮助-->root@all (2)[f:5]$ cd web    <!--使用cd命令切换主机或分组-->root@web (2)[f:5]$ list                  <!--列出当前的设备-->192.168.100.20192.168.100.30<!--支持Tab键补全,快捷键Ctrl+D或Ctrl+C即可退出当前的虚拟终端-->

4、Ansible模块

1)command模块

command模块在远程主机执行命令,不支持管道、重定向等shell的特性。常用的参数如下:

  • chdir:在远程主机上运行命令前要提前进入的目录;
  • creates:在命令运行时创建一个文件,如果文件已存在,则不会执行创建任务;
  • removes:在命令运行时移除一个文件,如果文件不存在,则不会执行移除任务;
  • executeable:指明运行命令的shell程序;

在所有主机上运行“ls ./”命令,运行前切换到/home目录下。操作如下:

[root@centos01 ~]# ansible web -m command -a "chdir=/ ls ./"

2)shell模块

shell模块在远程主机执行命令,相当于调用远程主机的Shell进程,然后在该Shell下打开一个子Shell运行命令。和command模块的区别是它支持Shell特性:如管道、重定向等。示例如下:

[root@centos01 ~]# ansible web -m shell -a "echo hello world "        <!--输出到屏幕-->192.168.100.20 | SUCCESS | rc=0 >>hello world192.168.100.30 | SUCCESS | rc=0 >>hello world[root@centos01 ~]# ansible web -m shell -a "echo hello world > /1.txt"   <!--输出到1.txt文件中-->192.168.100.20 | SUCCESS | rc=0 >>192.168.100.30 | SUCCESS | rc=0 >>

3)copy模块

copy模块用于复制指定主机文件到远程主机的指定位置。常见的参数如下:

  • dest:指出复制文件的目标目录位置,使用绝对路径。如果源是目录,则目标也要是目录,如果目标文件已存在,会覆盖原有内容;
  • src:指出源文件的路径,可以使用相对路径和绝对路径,支持直接指定目录。如果源是目录,则目标也要是目录;
  • mode:指出复制时,目标文件的权限,可选;
  • owner:指出复制时,目标文件的属主,可选;
  • group:指出复制时目标文件的属组,可选;
  • content:指出复制到目标主机上的内容,不能和src一起使用,相当于复制content指明的数据到目标文件中;

示例如下:

[root@centos01 ~]# ansible web -m copy -a "src=/etc/hostsdest=/root/a1.hosts mode=777 owner=root group=root"<!--/将本机的hosts文件复制到web组中的所有主机上存放在家目录下的a1.hosts目录,权限是777,属主是root,属组是root-->

4)hostname模块

hostname模块用于管理远程主机上的主机名。常用的参数如下:name:指明主机名;示例如下:

[root@centos01 ~]# ansible 192.168.100.20 -m hostname -a "name=test"<!--将192.168.100.20的主机名改为test,但是192.168.100.20需要敲一下bash才生效-->

5)yum模块

yum模块基于yum机制,对远程主机管理程序包。常用的参数如下:

  • name:程序包名称,可以带上版本号。若不指明版本,则默认为最新版本;
  • state=present|atest|absent:指明对程序包执行的操作:present表明安装程序包,latest表示安装最新版本的程序包,absent表示卸载程序包;
  • disablerepo:在用yum安装时,临时禁用某个仓库的ID;
  • enablerepo:在用yum安装时,临时启用某个仓库的ID;
  • conf_file:yum运行时的配置文件,而不是使用默认的配置文件;
  • disable_gpg_check=yes|no:是否启用完整性校验功能;

示例如下:

[root@centos01 ~]# ansible web -m shell -a "/usr/bin/rm -rf/etc/yum.repos.d/CentOS-*"          <!--批量化删除web组主机的yum源-->[root@centos01 ~]# ansible web -m shell -a "/usr/bin/mount/dev/cdrom /mnt"   <!--批量化挂载光盘--> [WARNING]: Consider using mount module rather than running mount192.168.100.20 | SUCCESS | rc=0 >>mount: /dev/sr0 写保护,将以只读方式挂载192.168.100.30 | SUCCESS | rc=0 >>mount: /dev/sr0 写保护,将以只读方式挂载[root@centos01 ~]# ansible web -m yum -a "name=httpdstate=present"  <!--批量化安装httpd程序-->[root@centos01 ~]# ansible web -m shell -a "rpm -qa | grep httpd"    <!--批量化查看安装的httpd程序包--> [WARNING]: Consider using yum, dnf or zypper module rather than running rpm192.168.100.20 | SUCCESS | rc=0 >>httpd-2.4.6-67.el7.centos.x86_64httpd-tools-2.4.6-67.el7.centos.x86_64192.168.100.30 | SUCCESS | rc=0 >>httpd-2.4.6-67.el7.centos.x86_64httpd-tools-2.4.6-67.el7.centos.x86_64[root@centos01 ~]# ansible web -m shell -a "systemctl start httpd"       <!--批量启动服务-->[root@centos01 ~]# ansible web -m shell -a "netstat -anptu | grep httpd"     <!--批量化监听httpd服务是否启动成功-->192.168.100.20 | SUCCESS | rc=0 >>tcp6       0      0 :::80                   :::*                    LISTEN      2072/httpd192.168.100.30 | SUCCESS | rc=0 >>tcp6       0      0 :::80                   :::*                    LISTEN      3098/httpd

管理端只是发送yum指令到被管理端,被管理端要存在可用的yum仓库才可以成功安装。

6)service模块

service模块为用来管理远程主机上的服务的模块。常见的参数如下:

  • name:被管理的服务名称;
  • state=started|stopped|restarted:动作包含启动,关闭或重启;
  • enable=yes|no:表示是否设置该服务开机自启动;
  • runlevel:如果设定了enabled开机自启动,则要定义在哪些运行目标下自动启动;

示例如下:

[root@centos01 ~]# ansible web -m service -a "name=httpdenabled=yes state=restarted"<!--设置httpd服务重新启动和开机自动启动-->

7)user模块

user模块主要用于管理远程主机上的用户账号。常见的参数如下:name:必选参数,账号名称;state=present|absent:创建账号或者删除账号,present表示创建,absent表示删除;system=yes|no:是否为系统账户;uid:用户UID;group:用户的基本组groups:用户的附加组;shell:默认使用的shell;
home:用户的家目录;
mve_home=yes|no:
如果设置的家目录已经存在,是否将已存在的家目录进行移动;
pssword:用户的密码,建议使用加密后的字符串;
comment:
用户的注释信息;
remore=yes|no:
当state=absent时,是否要删除用户的家目录;创建用户示例如下:

[root@centos01 ~]# ansible web -m user -a "name=user01system=yes uid=502 group=root groups=root shell=/etc/nologinhome=/home/user01 password=pwd@123"<!--在web组的所有主机上新建一个系统用户,UID为502,属组是root,名字是user01,密码是pwd@123-->

四、playbook配置文件

1、执行配置文件

playbook配置文件使用YAML语法,具有简洁明了、结构清晰等特点。playbook配置文件类似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。上面介绍的ansible命令虽然可以完成各种任务,但是当配置一些复杂任务时,逐条输入就显得效率非常低下。更有效的方案是在playbook配置文件中放置所有的任务代码,利用ansible-playbook命令执行该文件,可以实现自动化运维。YAML文件的扩展名通常为.yaml或.yml。YAML语法与其他高级语言类似,其结构通过缩进来展示,通过“-”来代表项;“:”用来分隔键和值;整个文件以“—-”开头并以“…”结尾,如下所示:

[root@centos01 ~]# grep -v ^# /etc/ansible/hosts | grep -v ^$              <!--查看hosts中的分组信息-->[web1]192.168.100.20[web2]192.168.100.30[root@centos01 ~]# vim /etc/ansible/a.yml                   <!--创建a.yml文件,写入以下内容-->---- hosts: web1                   <!--针对web1组中的操作-->  remote_user: root                    <!--远端执行用户身份为root-->  tasks:                <!--任务列表-->        - name: adduser                               <!--任务名称-->          user: name=user1 state=present <!--执行user模块,创建用户-->          tags:                <!--创建tag标签-->          - aaa                 <!--tag标签为aaa-->        - name: addgroup           <!--任务名称-->          group: name=root system=yes <!--执行group模块,创建组-->          tags:               <!--创建tag标签-->          - bbb               <!--tag标签为bbb-->- hosts: web2               <!--针对web2组中的操作-->  remote_user: root        <!--远端执行用户身份为root-->  tasks:                     <!--任务列表-->        - name: copy file to web            <!--任务名称-->          copy: src=/etc/passwd dest=/home        <!--执行copy模块,复制文件-->          tags:                        <!--创建tag标签-->          - ccc                     <!--tag标签为ccc-->...

所有的“-”和“:”后面均有空格,而且注意缩进和对齐,如下图所示:

playbook的核心元素包含:hosts:任务的目标主机,多个主机用冒号分隔,一般调用/etc/ansible/hosts中的分组信息;remote_user:远程主机上,运行此任务的默认身份为root;tasks:任务,即定义的具体任务,由模块定义的操作列表;handlers:触发器,类似tasks,只是在特定的条件下才会触发的任务。某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers进行触发执行;
roles:角色,将hosts剥离出去,由tasks、handlers等所组成的一种特定的结构集合;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:从指定的任务开始往下运行;

执行playbook的示例如下:

[root@centos01 ~]# ansible-playbook --syntax-check /etc/ansible/a.yml    <!--语法检测-->playbook: /etc/ansible/a.yml     <!--表示没有报错-->[root@centos01 ~]# ansible-playbook -C /etc/ansible/a.yml         <!--对a.yml进行预测试-->    .................<!--省略部分内容-->192.168.100.20       : ok=3    changed=1    unreachable=0    failed=0192.168.100.30       : ok=2    changed=1    unreachable=0    failed=0<!--返回结果表示没有错误,全部可以执行成功。-->[root@centos01 ~]# ansible-playbook --list-hosts /etc/ansible/a.yml<!--列出a.yml文件中的主机-->[root@centos01 ~]# ansible-playbook --list-tasks /etc/ansible/a.yml<!--列出任务-->[root@centos01 ~]# ansible-playbook --list-tags /etc/ansible/a.yml           <!--列出标签-->[root@centos01 ~]# ansible-playbook /etc/ansible/a.yml                <!--执行任务-->[root@centos01 ~]# ssh 192.168.100.20 tail -1 /etc/passwd <!--确认执行结果-->user1:x:1001:1001::/home/user1:/bin/bash[root@centos01 ~]# ssh 192.168.100.30 ls -ld /home/passwd-rw-r--r--. 1 root root 2342 7月  23 16:06 /home/passwd<!--一般情况先执行“-C”命令进行预测试,没有问题后再执行.yml文件。-->

通常情况下先执行 ansible-playbook -C /PATH/TO/PLAYBOOK.yaml 命令进行测试,测试没问题后再执行 ansible-playbook /PATH/TO/PLAYBOOK.yml 命令。

2、触发器

需要触发才能执行的任务,当之前定义在tasks中的任务执行成功后,若希望在此基础上触发其他任务,这时就需要定义handlers。例如,当通过ansible的模块对目标主机的配置文件进行修改之后,如果任务执行成功,可以触发一个触发器,在触发器中定义目标主机的服务重启操作,以使配置文件生效。handlers触发器具有以下特点:

  • handlers是Ansible提供的条件机制之一。
  • handlers和task很类似,但是它只在被task通知的时候才会触发执行。
  • handlers只会在所有任务执行完成后执行。
  • 而且即使被通知了很多次,它也只会执行一次。
  • handlers按照定义的顺序依次执行。

handlers触发器的使用示例如下:

[root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 80                  <!--查询100.20主机监听的端口-->tcp6       0      0 :::80         :::*          LISTEN      94858/httpd<!--可以看到是监听80端口,现在通过脚本改为8080端口,并使其生效。-->[root@centos01 ~]# vim /etc/ansible/httpd.yml            <!--编辑httpd.yml文件,写入以下内容-->---- hosts: web1  remote_user: root  tasks:        - name: change port          command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf          notify:                             <!--配置触发条件-->                - restart httpd server    <!--完成该任务后调用名为“restart httpd server”的触发器-->  handlers:                                      <!--配置触发器-->        - name: restart httpd server  <!--指定触发器名字,要和上面“notify”指定的触发器名字一样-->          service: name=httpd state=restarted<!--触发任务为重启httpd服务-->...<!--编写完成后,保存退出即可-->[root@centos01 ~]# ansible-playbook -C /etc/ansible/httpd.yml          <!--进行预测试-->[root@centos01 ~]# ansible-playbook  /etc/ansible/httpd.yml               <!--执行脚本-->[root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 8080        <!--远端主机已经运行8080端口-->tcp6       0      0 :::8080        :::*         LISTEN      103594/httpd

3、角色

将多种不同的tasks的文件集中存储在某个目录下,则该目录就是角色。角色一般存放在 /etc/ansible/roles/ 目录,可通过ansible的配置文件来调整默认的角色目录,/etc/ansible/roles/ 目录下有很多子目录,其中每一个子目录对应一个角色,每个角色也有自己的目录结构,如下图所示:

/etc/ansible/roles/为角色集合,该目录下有自定义的各个子目录:

  • mariadb:mysql角色;
  • Apache:httpd角色;
  • Nginx:Nginx角色;

每个角色的定义,以特定的层级目录结构进行组织。以mariadb(mysql角色)为例:

  • files:存放由copy或script等模块调用的文件;
  • templates:存放template模块查找所需要的模板文件的目录,如mysql配置文件模板;
  • tasks:任务存放的目录;
  • handlers:存放相关触发执行的目录;
  • vars:变量存放的目录;
  • meta:用于存放此角色元数据;
  • default:默认变量存放的目录,文件中定义了此角色使用的默认变量;

上述目录中,tasks、handlers、vars、meta、default至少应该包含一个main.yml文件,该目录下也可以有其他.yml文件,但是需要在main.yml文件中用include指令将其他.yml文件包含进来。有了角色后,可以直接在yaml文件(playbook配置文件)中调用角色,示例如下:

- hosts: web  remote_user: root  roles:  - mysql        <!--调用角色名-->  - httpd             <!--调用角色名-->

可以只调用一个角色,也可以调用多个角色,当定义了角色后,用ansible-playbook PALYBOOK文件执行即可。此时ansible会到角色集合的目录(/etc/ansible/roles)去找mysql和httpd目录,然后依次运行mysql和httpd目录下的所有代码。下面来个安装及配置mariadb数据库的实例需求分析:

  • 要求被管理主机上自动安装mariadb,安装完成后上传提前准备好的配置文件至远端主机,重启服务,然后新建testdb数据库,并允许test用户对其拥有所有权限。
  • 被管理主机配置yum仓库,自行配置,若被管理端可以连接互联网,那么直接将yum仓库指向互联网即可。

转自:51CTO博客-俊伟祺i https://blog.51cto.com/14156658/2461907

50只估值偏低的股票(ROE、市盈率、市净率)

1、康臣药业,ROE=23%,市盈率7.16,市净率1.64。

主营业务:中成药以及医用成像对比剂的研究、制造、销售,主导产品尿毒清颗粒。

 

2、浙江龙盛,ROE=22%,市盈率8.7,市净率1.91。

主营业务:染料、中间体、减水剂等特殊化学品为主,无机化工等基础化学品为辅。

 

3、海螺水泥,ROE=27%,市盈率8.06,市净率2。

主营业务:水泥以及商品熟料的生产、销售。

 

4、文山电力,ROE=17%,市盈率7.28,市净率1.66。

主营业务:水力发电、供电、配电。

 

5、航民股份,ROE=17%,市盈率10.21,市净率1.48。

主营业务:纺织、印染等材料生产、销售,热电生产,媒体采购销售,经营进出口业务。

 

6、中国平安,ROE=24%,市盈率9.05,市净率2.44。

主营业务:金融、保险,提供多元化的金融产品及服务。

 

7、东莞控股,ROE=18%,市盈率7.64,市净率1.22。

主营业务:高速公路运营管理、融资租赁业务、商业保险等。

 

9、尖峰集团,ROE=21%,市盈率6.42,市净率1.44。

主营业务:以水泥和医药业务为主,以国际贸易、电缆等业务为辅。

 

10、华新水泥,ROE=30%,市盈率7.36,市净率2.39。

主营业务:水泥的生产和销售。

 

11、祁连山,ROE=18%,市盈率6.43,市净率1.35。

主营业务:水泥的研究、制造、销售。

 

12、万年青,ROE=25%,市盈率7.22,市净率1.98。

主营业务:硅酸盐水泥熟料以及硅酸盐水泥的生产和销售。

 

13、露天煤业,ROE=17%,市盈率6.15,市净率1.02。

主营业务:煤炭的生产和销售,火力发电等。

 

14、大亚圣象,ROE=17%,市盈率11.83,市净率1.56。

主营业务:人造板和木地板的生产、销售。

 

15、天山股份,ROE=17%,市盈率7.29,市净率1.25。

主营业务:硅酸盐熟料、各类硅酸盐水泥的生产和销售。

 

16、陕西煤业,ROE=20%,市盈率6.99,市净率1.5。

主营业务:煤炭的生产、销售和运输。

 

17、盘江股份,ROE=16%,市盈率8.34,市净率1.41。

主营业务:煤炭的生产、销售和运输等。

 

18、海越能源,ROE=17%,市盈率6.29,市净率1.28。

主营业务:石油及制品的销售、成品油仓储、投资、公路征费、物业租赁。

 

19、旗滨集团,ROE=16%,市盈率10.13,市净率1.61。

主营业务:玻璃以及玻璃制品的生产、销售。

 

20、阳光照明,ROE=14%,市盈率10.16,市净率1.85。

主营业务:照明电器的研发、生产和销售。

 

21、同德化工,ROE=15%,市盈率12.24,市净率1.97。

主营业务:民用炸药的研发、生产和销售,以及为客户提供爆破工程的解决方案等。

 

22、宁沪高速,ROE=16%,市盈率11.53,市净率1.98。

主营业务:江苏省境内收费路桥的投资、建设、经营和管理,以及公路沿线的服务区配套经营。

 

23、勘设股份,ROE=15%,市盈率10.85,市净率1.42。

主营业务:工程咨询与工程承包。

 

24、富森美,ROE=17%,市盈率11.61,市净率1.95。

主营业务:建材家居和汽配市场的开发、租赁和服务。

 

25、万和电气,ROE=17%,市盈率11.64,市净率1.99。

主营业务:围绕生活热水供应和燃气具的主线,研发、制造销售各种热水器、燃气具、油烟机、消毒柜等产品。

 

26、海翔药业,ROE=15%,市盈率12,市净率1.97。

主营业务:特色原料药、制剂的生产和销售;环保型活性染料、染料中间体的生产和销售。

 

27、渤海轮渡,ROE=12%,市盈率11,市净率1.53。

主营业务:烟台至大连、蓬莱至旅顺客滚船运输业务

 

28、宁夏建材,ROE=13%,市盈率6.11,市净率0.91。

主营业务:水泥的制造、销售。

 

29、中国神华,ROE=13%,市盈率7.15,市净率1.02。

主营业务:煤炭、电力的生产和销售、铁路、港口和船舶运输。

 

30、华润双鹤,ROE=13%,市盈率10.92,市净率1.58。

主营业务:药品开发、制造和销售。

 

31、垒知集团,ROE=13%,市盈率9.69,市净率1.46。

主营业务:建设综合技术服务、商品混凝、外加剂新材料、特种工程施工等。

 

32、青岛港,ROE=13%,市盈率11.62,市净率1.54。

主营业务:提供集装箱、金属矿石、煤炭等货物的装卸和配套服务、物流以及港口增值服务。

 

33、明泰铝业,ROE=12%,市盈率7.29,市净率0.97。

主营业务:印刷铝板基、复合铝板带箔等的生产和销售。

 

34、汇洁股份,ROE=12%,市盈率11.66,市净率1.8。

主营业务:内衣研究、品牌策划推广、市场营销。

 

35、安徽合力,ROE=13%,市盈率10.77,市净率1.45。

主营业务:工业车辆、装载机等产品等研发、生产和销售。

 

36、武进不锈,ROE=12%,市盈率9.13,市净率1.31。

主营业务:工业不锈钢管及管件的研发、生产和销售。

 

37、闰土股份,ROE=15%,市盈率8.87,市净率1.5。

主营业务:纺织染料、印染助剂和化工原料的研发、生产和销售。

 

38、常宝股份,ROE=13%,市盈率8.32,市净率1.3。

主营业务:钢管生产销售、医疗服务。

 

39、三星医疗,ROE=12%,市盈率9.21,市净率1.26。

主营业务:电能计量及信息采集产品、配电设备的研发、生产和销售。

 

40、安正时尚,ROE=11%,市盈率12.9,市净率1.7。

主营业务:中高档品牌时装的自主研发、生产、销售以及品牌管理。

 

41、江中药业,ROE=15%,市盈率12.64,市净率1.83。

主营业务:中成药的研发、生产和销售。

 

42、西藏天路,ROE=14%,市盈率10.69,市净率1.78。

主营业务:公路工程基础设施建设、建设生产销售以及矿业开发等实体。

 

43、南方传媒,ROE=13%,市盈率10.12,市净率1.39。

主营业务:图书出版发行、印刷及物资供应、报刊和新媒体。

 

44、永高股份,ROE=13%,市盈率11.91,市净率1.62。

主营业务:塑料管道和塑料型材的研发、生产和销售。

45、三钢闽光,ROE=17%,市盈率5.75,市净率1.21。

主营业务:钢铁的冶炼、轧制、加工、生产和销售。

 

46、氯碱化工,ROE=16%,市盈率9.77,市净率1.83。

主营业务:碱和氯等化工原理及产品。

 

47、京新药业,ROE=14%,市盈率11.34,市净率1.99。

主营业务:化学制剂、传统中药、生物制剂、化学原料药、医疗器械等的研发、生产、销售。

 

48、海利尔,ROE=17%,市盈率11.27,市净率1.89。

主营业务:农药制剂、农药原药以及相关中间体的生产与销售。

 

49、苏利股份,ROE=15%,市盈率11.4,市净率1.95。

主营业务:农药、阻燃剂等研发、生产和销售。

 

50、兴蓉环境,ROE=10%,市盈率11.16,市净率1.25。

主营业务:自来水供应、污水处理及垃圾渗滤液处理。

作者:村长有话说

转自:https://mp.weixin.qq.com/s/ju_78_GjhqV9vdyWtgHB-w